QEventPress... qualche chiarimento.



  • 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:
    aggiungi QApplication::processEvents(); all'interno del loop

    l'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



  • Grande VRonin. Mi sei mancato nel periodo di ferie.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.