QEventPress... difficoltà di utilizzo
-
Nessuna insolenza, figurati.
La risposta e' si ma nel 99.9999999999% dei casi non lo vuoi fare.la prassi normale (e ci sono ragioni di semplicita' di desing e velocita' di compilazione) e' mantenere solo le dichiarazioni nel file .h e spostare le definizioni nel file .cpp
-
Non ci riesco. Se non mi dai tu la soluzione bell'e pronta, non vado avanti.
Ho il costruttore .cpp così:HRnet_0100_QuadroComandi::HRnet_0100_QuadroComandi(QWidget* parent = Q_NULLPTR) : QDialog(parent) ,m_risultatoContatore(new QFutureWatcher<unsigned int>(this)) ,ui(new Ui::HRnet_0100_QuadroComandi) { faseesecuzione=false; connect(m_risultatoContatore,&QFutureWatcher<unsigned int>::finished,this,[this](){ cicliContati(m_risultatoContatore->future().result()); }); connect(this,&HRnet_0100_QuadroComandi::cicliContati,[](unsigned int cicli)->void{ qDebug() << "cicli: "<< cicli; }); ui->setupUi(this); ... altre istruzioni
e la relativa dichiarazione fatta così:
class HRnet_0100_QuadroComandi : public QDialog { Q_OBJECT Q_DISABLE_COPY(HRnet_0100_QuadroComandi) public: explicit HRnet_0100_QuadroComandi(QWidget *parent); ... altre istruzioni
Nel main.cpp ho le seguenti istruzioni:
HRnet_0100_QuadroComandi *HRnet_0100; HRnet_0100 = new HRnet_0100_QuadroComandi;
ma c'è qualcosa che non va, non compila. Come dovrei aggiustare l'header ?
-
Ho fatto tante di quelle prove, senza comprenderne il significato, che ora non ricordo bene quale errore mi compariva. Mi pare che si piantasse nel main.cpp dicendo qualcosa tipo "no matching function for call to ..." all'assegnazione HRnet_0100 = new HRnet_0100_QuadroComandi; . Ho pensato che volesse un parametro e forse ho risolto facendo terminare l'istruzione con "(0);". Se la soluzione è quella giusta (ovvero passargli un parametro a zero), si blocca poi su:
static unsigned int HRnet_0100_QuadroComandi::contaCicli(const std::atomic_bool* const stopper){ //importante che sia static unsigned int result =0; for(;stopper->load();++result){} return result; }
della cui prima riga capisco poco e niente. Cosa dovrei mettere nell'header ?
-
Una domanda (se accetti la mia pedanteria).
Nella spiegazione della sintassi da utilizzare per una routine ho trovato che se nell'header scrivo "int routine(string);" nel .cpp ci sarà "int routine(string parametrostringa) e la routine terminerà col return di un intero. C'è una corrispondenza fra header e cpp. Corrispondenza che non trovo nel costruttore della classe. Come ultimo elemento passo riferimenti a modulo ui, senza che nell'header ci sia niente, inoltre con l'aggiunta del rigo "m_risultatoContatore" di questo parametro non ho indicato nulla nell'header. Ma poi, quelle due parti del costruttore si possono chiamare parametri ? Che ignorante che sono. :-( -
@bvox123 said in QEventPress... difficoltà di utilizzo:
Suggerimento per una persona tanto precisa che apprezzerà il suggerimento per ovviare a futuri errori: "da" terza persona singolare del verbo dare va accentata ("dà").
Questo e' il motivo di "piccola nota
= Q_NULLPTR
e meglio sia messo nell'header invece che len cpp"si blocca poi su:
puoi postare l'errore?
della cui prima riga capisco poco e niente
come regola generale non va mai passato un metodo non statico a
Qt::Concurrent
perche' l'oggetto potrebbe essere distrutto prima cheQt::Concurrent
finisca e crashare questo e' il motivo per cui ho messo static. D'altra parte ho reintrodotto il problema passandofaseesecuzione
quindi "I played myself". Per vedere il problema, premi F11 (1 sola volta) e chiudi il programma. Dovrebbe crashare. Piu' tardi lo aggiusto.verbo dare va accentata ("dà").
touché
@bvox123 said in QEventPress... difficoltà di utilizzo:
C'è una corrispondenza fra header e cpp.
Corretto, e' necessario che ci sia.
@bvox123 said in QEventPress... difficoltà di utilizzo:
Ma poi, quelle due parti del costruttore si possono chiamare parametri ?
no, e' una lista di inizializzazione
-
Sono ancora lontano dal poter effettuare una prova e farlo crashare.
Spero comunque di essere all'ultimo problema.
Nell'header ho *void keyPressEvent(QKeyEvent ); e nel .cpp la routinevirtual void HRnet_0100_QuadroComandi::keyPressEvent(QKeyEvent *event) Q_DECL_OVERRIDE{ if (event->key() >= Qt::Key_F10 && event->key() <= Qt::Key_F12){ faseesecuzione = !faseesecuzione; if(faseesecuzione) m_risultatoContatore->setFuture(QtConcurrent::run(&HRnet_0100_QuadroComandi::contaCicli,&faseesecuzione)); return; } return QWidget::keyPressEvent(event); }
ed ottengo i seguenti errori:
Anche mettendo "virtual" nella definizione l'errore rimane. Noto che l'errore lo segnala su un modulo non scritto da me. -
Sì sì, ho fatto così e mi viene quell'errore. Per tranquillità riposto le due parti:
protected: Ui::HRnet_0100_QuadroComandi *ui; virtual void keyPressEvent(QKeyEvent *);
void HRnet_0100_QuadroComandi::keyPressEvent(QKeyEvent *event) Q_DECL_OVERRIDE{ if (event->key() >= Qt::Key_F10 && event->key() <= Qt::Key_F12){ faseesecuzione = !faseesecuzione; if(faseesecuzione) m_risultatoContatore->setFuture(QtConcurrent::run(&HRnet_0100_QuadroComandi::contaCicli,&faseesecuzione)); return; } return QWidget::keyPressEvent(event); }
e l'errore:
-
Nella routine che fa il loop infinito ho inserito uno sleep di 5 secondi per avere il tempo di fare click sul form e pigiare un tasto funzione. Inoltre ho messo un cout all'interno della routine loop. Ecco le routines:
while (faseesecuzione != 0) { // QApplication::processEvents(); AzioniSulCasino(); attesa.msleep(5000); }
void HRnet_0100_QuadroComandi::keyPressEvent(QKeyEvent *event) { if (event->key() >= Qt::Key_F1 && event->key() <= Qt::Key_F12){ faseesecuzione = !faseesecuzione; cout << "KeyPress intercettato. faseesecuzione = " << faseesecuzione << endl; if(faseesecuzione) m_risultatoContatore->setFuture(QtConcurrent::run(&HRnet_0100_QuadroComandi::contaCicli,&faseesecuzione)); return; } return QWidget::keyPressEvent(event); }
Provato più volte a ridare il focus alla schermata e pigiare un tasto funzione, ma niente... ho dovuto chiudere il programma col click sulla X di chiusura (durante l'attesa dei 5 secondi). Nessun messaggio sul logout, quindi non entra nella routine. L'attesa è necessaria perché durante l'esecuzione normale il mouse viene spostato dal programma.
-
Quando pigio un pulsante metto a 1 la variabile faseesecuzione e resterà così finché non viene intercettata la pressione di un tasto funzione e lo riporta a zero. Forse qui c'è un errore, perché "non 1" credo che divenga -1 e non zero, comunque nella routine del keypressevent non è mai entrato.