Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Italian
  4. QEventPress... difficoltà di utilizzo
Forum Updated to NodeBB v4.3 + New Features

QEventPress... difficoltà di utilizzo

Scheduled Pinned Locked Moved Unsolved Italian
28 Posts 2 Posters 10.4k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • B Offline
    B Offline
    bvox123
    wrote on last edited by
    #1

    Buongiorno.
    Ho provato ad utilizzare entrambe le soluzioni prospettatemi da VRonin, ma per entrambe ho difficltà.
    Quella definita "più semplice ma meno pulita" funziona male: solo inserendo nel loop uno sleep di qualche secondo riesco a ridare il focus (non so se si dice così anche in questo ambiente) alla finestra che contiene la routine e, solo in questo caso, funziona la digitazione di un tasto funzione. Ma se il focus è su un'altra finestra hai voglia a pigiare i tasti funzione. non si bloccherà mai. Senza mettere lo sleep ho dovuto spegnere il pc e farlo ripartire.
    La soluzione più complessa è piena di termini e cose che non conosco.

    #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;
        }
    };
    

    Questa è tutta da inserire nell'header ? Se è così, credo di avere apportato le necessarie variazioni (nome classe, classe base QDialog, etc.) ma mi dà i seguenti errori in compilazione. Ah dimenticavo, fra gli include il QtConcurrentRun è una sottocartella di QtConcurrent.
    0_1504176308554_Schermata del 2017-08-31 12-43-51.png
    Come posso risolvere ?

    1 Reply Last reply
    0
    • VRoninV Offline
      VRoninV Offline
      VRonin
      wrote on last edited by VRonin
      #2

      Prima di tutto un po' di contesto. La domanda originale era https://forum.qt.io/topic/82817/qeventpress-qualche-chiarimento

      gli errori che leggi derivano dal fatto che non hai cancellato la tua prcedente implementazione. hai lasciato sia std::atomic_bool faseesecuzione; che int faseesecuzione; e hai 2 keyPressEvent

      Per i curiosi, QtConcurrent::run e QFutureWatcher possono essere sostituiti con std::async e un QObject che si prende cura di segnalare la fine

      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
      ~Napoleon Bonaparte

      On a crusade to banish setIndexWidget() from the holy land of Qt

      1 Reply Last reply
      0
      • B Offline
        B Offline
        bvox123
        wrote on last edited by
        #3

        Il post che avevo inserito ieri lo avevo etichettato come "chiuso" ed allora ho creduto opportuna avviarne uno nuovo.
        Ho provato a rimediare ai miei errori, ma non riesco a compilare. Ecco gli errori, a seguire la parte iniziale della routine modificata per consentire di darmi i suggerimenti più idonei.
        0_1504179194239_Schermata del 2017-08-31 13-32-44.png

        #ifndef HRNET_0100_QUADROCOMANDI_H
        #define HRNET_0100_QUADROCOMANDI_H
        #include <QDialog>
        #include <QWidget>
        #include <QFutureWatcher>
        #include <QtConcurrent/QtConcurrentRun>
        #include <atomic>
        #include <QKeyEvent>
        #include <iostream>
        namespace Ui {
        class HRnet_0100_QuadroComandi;
        }
        struct structTabIndici {
        ... vari int
        };
        class HRnet_0100_QuadroComandi : public QDialog
        {
            Q_OBJECT
            Q_DISABLE_COPY(HRnet_0100_QuadroComandi)
            std::atomic_bool faseesecuzione;
            QFutureWatcher<unsigned int>* m_risultatoContatore;
        protected:
            virtual void keyPressEvent(QKeyEvent *event) Q_DECL_OVERRIDE{
                if (event->key() >= Qt::Key_F1 && event->key() <= Qt::Key_F12){
                    faseesecuzione = !faseesecuzione;
                    if(faseesecuzione)
                        m_risultatoContatore->setFuture(QtConcurrent::run(&HRnet_0100_QuadroComandi::contaCicli,&faseesecuzione));
                    return;
                }
                return QDialog::keyPressEvent(event);
            }
        public:
            HRnet_0100_QuadroComandi(QDialog* parent = Q_NULLPTR)
                : QDialog(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,&HRnet_0100_QuadroComandi::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;
            }
        public:
        //    explicit HRnet_0100_QuadroComandi(QWidget *parent = 0);
            ~HRnet_0100_QuadroComandi();
        
        
        VRoninV 1 Reply Last reply
        0
        • B bvox123

          Il post che avevo inserito ieri lo avevo etichettato come "chiuso" ed allora ho creduto opportuna avviarne uno nuovo.
          Ho provato a rimediare ai miei errori, ma non riesco a compilare. Ecco gli errori, a seguire la parte iniziale della routine modificata per consentire di darmi i suggerimenti più idonei.
          0_1504179194239_Schermata del 2017-08-31 13-32-44.png

          #ifndef HRNET_0100_QUADROCOMANDI_H
          #define HRNET_0100_QUADROCOMANDI_H
          #include <QDialog>
          #include <QWidget>
          #include <QFutureWatcher>
          #include <QtConcurrent/QtConcurrentRun>
          #include <atomic>
          #include <QKeyEvent>
          #include <iostream>
          namespace Ui {
          class HRnet_0100_QuadroComandi;
          }
          struct structTabIndici {
          ... vari int
          };
          class HRnet_0100_QuadroComandi : public QDialog
          {
              Q_OBJECT
              Q_DISABLE_COPY(HRnet_0100_QuadroComandi)
              std::atomic_bool faseesecuzione;
              QFutureWatcher<unsigned int>* m_risultatoContatore;
          protected:
              virtual void keyPressEvent(QKeyEvent *event) Q_DECL_OVERRIDE{
                  if (event->key() >= Qt::Key_F1 && event->key() <= Qt::Key_F12){
                      faseesecuzione = !faseesecuzione;
                      if(faseesecuzione)
                          m_risultatoContatore->setFuture(QtConcurrent::run(&HRnet_0100_QuadroComandi::contaCicli,&faseesecuzione));
                      return;
                  }
                  return QDialog::keyPressEvent(event);
              }
          public:
              HRnet_0100_QuadroComandi(QDialog* parent = Q_NULLPTR)
                  : QDialog(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,&HRnet_0100_QuadroComandi::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;
              }
          public:
          //    explicit HRnet_0100_QuadroComandi(QWidget *parent = 0);
              ~HRnet_0100_QuadroComandi();
          
          
          VRoninV Offline
          VRoninV Offline
          VRonin
          wrote on last edited by
          #4

          Hai cose della vecchia classe in quadrocomandi.cpp che devi eliminare.

          Di secondaria importanza HRnet_0100_QuadroComandi(QDialog* parent = Q_NULLPTR) dovrebbe essere HRnet_0100_QuadroComandi(QWidget* parent = Q_NULLPTR). non e' necessario imporre quella restrizione

          "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
          ~Napoleon Bonaparte

          On a crusade to banish setIndexWidget() from the holy land of Qt

          1 Reply Last reply
          0
          • B Offline
            B Offline
            bvox123
            wrote on last edited by
            #5

            Ho provato con questa modifica, ma ancora non va.
            Mi dà errore "Redefination... " sia sull routine di creazione della classe (in .cpp), sia sulla routine del keyPressEvent, anche questo nel .cpp.
            Ho pensato che la routine keyPressEvent la potrei togliere, visto che è scritta nell'header, ma il costruttore della classe non credo proprio di poterlo eliminare. Qualche consiglio ?
            Quali altre cose della vecchia classe potrebbero non essere compatibili ? Per caso, l'incompatibilità è con la classe QDialog, dato che è questa la classe base utilizzata per il QuadroComandi.

            1 Reply Last reply
            0
            • VRoninV Offline
              VRoninV Offline
              VRonin
              wrote on last edited by
              #6

              Se definisci qualcosa nell'header non devi re-definirla nel cpp.
              Oppure puoi semplicemente spostare quello che e' adesso nell'header nel file .cpp basta che non siano duplicati

              Di solito posto codice "header only" per semplicita' di scrittura

              "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
              ~Napoleon Bonaparte

              On a crusade to banish setIndexWidget() from the holy land of Qt

              1 Reply Last reply
              0
              • B Offline
                B Offline
                bvox123
                wrote on last edited by
                #7

                Perdona la mia insolenza, VRonin, ma tutte le istruzioni che ho visto e mi sono abituato ad inserire nell'header potrebbero andare nel .cpp ? Quindi anche "Q_OBJECT", "public:", "signals:", etc. ?

                1 Reply Last reply
                0
                • VRoninV Offline
                  VRoninV Offline
                  VRonin
                  wrote on last edited by
                  #8

                  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

                  "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                  ~Napoleon Bonaparte

                  On a crusade to banish setIndexWidget() from the holy land of Qt

                  1 Reply Last reply
                  0
                  • B Offline
                    B Offline
                    bvox123
                    wrote on last edited by
                    #9

                    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 ?

                    1 Reply Last reply
                    0
                    • VRoninV Offline
                      VRoninV Offline
                      VRonin
                      wrote on last edited by
                      #10

                      Non c'e' niente di evidentemente sbagliato nel codice che hai postato (piccola nota = Q_NULLPTR e meglio sia messo nell'header invece che len cpp).

                      Che errori ti da il compilatore?

                      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                      ~Napoleon Bonaparte

                      On a crusade to banish setIndexWidget() from the holy land of Qt

                      1 Reply Last reply
                      0
                      • B Offline
                        B Offline
                        bvox123
                        wrote on last edited by
                        #11

                        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 ?

                        1 Reply Last reply
                        0
                        • B Offline
                          B Offline
                          bvox123
                          wrote on last edited by
                          #12

                          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à").

                          VRoninV 1 Reply Last reply
                          0
                          • B Offline
                            B Offline
                            bvox123
                            wrote on last edited by
                            #13

                            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. :-(

                            1 Reply Last reply
                            0
                            • B bvox123

                              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à").

                              VRoninV Offline
                              VRoninV Offline
                              VRonin
                              wrote on last edited by
                              #14

                              @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 che Qt::Concurrent finisca e crashare questo e' il motivo per cui ho messo static. D'altra parte ho reintrodotto il problema passando faseesecuzione 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

                              "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                              ~Napoleon Bonaparte

                              On a crusade to banish setIndexWidget() from the holy land of Qt

                              1 Reply Last reply
                              0
                              • B Offline
                                B Offline
                                bvox123
                                wrote on last edited by
                                #15

                                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 routine

                                virtual 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:
                                0_1504259316092_Schermata del 2017-09-01 11-47-56.png
                                Anche mettendo "virtual" nella definizione l'errore rimane. Noto che l'errore lo segnala su un modulo non scritto da me.

                                1 Reply Last reply
                                0
                                • VRoninV Offline
                                  VRoninV Offline
                                  VRonin
                                  wrote on last edited by
                                  #16

                                  virtual va nella definizione della classe. sposta virtual dal .cpp al .h

                                  "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                                  ~Napoleon Bonaparte

                                  On a crusade to banish setIndexWidget() from the holy land of Qt

                                  1 Reply Last reply
                                  0
                                  • B Offline
                                    B Offline
                                    bvox123
                                    wrote on last edited by
                                    #17

                                    L'ho fatto, ma rimane il secondo errore detto prima: "virt-specifiers in ..."

                                    1 Reply Last reply
                                    0
                                    • VRoninV Offline
                                      VRoninV Offline
                                      VRonin
                                      wrote on last edited by
                                      #18

                                      hai lasciato virtual nel .cpp? se si toglilo. deve essere solo nel .h

                                      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                                      ~Napoleon Bonaparte

                                      On a crusade to banish setIndexWidget() from the holy land of Qt

                                      1 Reply Last reply
                                      0
                                      • B Offline
                                        B Offline
                                        bvox123
                                        wrote on last edited by
                                        #19

                                        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:
                                        0_1504261268713_Schermata del 2017-09-01 12-20-38.png

                                        1 Reply Last reply
                                        0
                                        • VRoninV Offline
                                          VRoninV Offline
                                          VRonin
                                          wrote on last edited by
                                          #20

                                          scusa, sono cieco. anche Q_DECL_OVERRIDE va nel .h non nel .cpp

                                          "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                                          ~Napoleon Bonaparte

                                          On a crusade to banish setIndexWidget() from the holy land of Qt

                                          1 Reply Last reply
                                          0

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved