QEventPress... qualche chiarimento.
Solved
Italian
-
Buongiorno.
Per prova, ho creato una routine di questo tipo:int faseesecuzione = 0; void Prova::keyPressEvent(QKeyEvent *e) { cout << e->key() << endl; if (e->key() >= Qt::Key_F10 && e->key() <= Qt::Key_F12) faseesecuzione = 1; else faseesecuzione = 0; e->accept(); int i = 0; while (faseesecuzione == 1 ) { i++; cout << i << endl; } }
Quando avvio il programma, si mette in attesa che io pigi un tasto e me lo fa vedere sul logout, ma se pigio da F10 a F12 parte il loop e non smette neppure se io pigio un altro tasto. Io vorrei proprio fare questo: cioè che un loop venga eseguito "eternamente" finché non si pigia qualche tasto scelto da me. C'è verso fare in modo che QEventPress venga eseguito con maggiore priorità del loop che ho inserito nella routine ?
-
soluzione facile e veloce ma non pulita:
aggiungiQApplication::processEvents();
all'interno del loopl'alternativa piu pulita e' usare un thread:
#include <QWidget> #include <QFutureWatcher> #include <QtConcurrentRun> #include <atomic> #include <QKeyEvent> #include <iostream> class Prova : public QWidget{ Q_OBJECT Q_DISABLE_COPY(Prova) std::atomic_bool faseesecuzione; QFutureWatcher<unsigned int>* m_risultatoContatore; protected: virtual void 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(&Prova::contaCicli,&faseesecuzione)); return; } return QWidget::keyPressEvent(event); } public: Prova(QWidget* parent = Q_NULLPTR) : QWidget(parent) ,m_risultatoContatore(new QFutureWatcher<unsigned int>(this)) { faseesecuzione=false; connect(m_risultatoContatore,&QFutureWatcher<unsigned int>::finished,this,[this](){ cicliContati(m_risultatoContatore->future().result()); }); connect(this,&Prova::cicliContati,[](unsigned int cicli)->void{ qDebug() << "cicli: "<< cicli; }); } Q_SIGNAL void cicliContati(unsigned int); static unsigned int contaCicli(const std::atomic_bool* const stopper){ //importante che sia static unsigned int result =0; for(;stopper->load();++result){} return result; } };
Edit: fixed buggy code