Partage
  • Partager sur Facebook
  • Partager sur Twitter

QTimer

    5 février 2019 à 14:23:29

    Bonjour, j'aimerai me servir de la fonction QTimer pour incrémenter un widget progressbar : c'est a dire a un intervalle de 200ms par exemples la progressbar gagne 1% .

    pour l'instant j'ai sa

    #include "c_cadre.h"
    #include "ui_c_cadre.h"
    #include<QTimer>
    C_cadre::C_cadre(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::C_cadre)
    {
        ui->setupUi(this);
        QTimer *timer = new QTimer(this);
        timer->setInterval(100);
           connect(timer, SIGNAL(timeout()), this, SLOT(update()));
    
    timer->start();
    
    
    }
    
    C_cadre::~C_cadre()
    {
        delete ui;
    }
    
    void C_cadre::on_progressBar_valueChanged(int value)
    {
      
    }
    


    mais je sais pas quoi mettre dans la fonction. en plus je crois qu'il y a un truc compliqué ou il faut utiliser un QString ou une chaine de charactère.

    • Partager sur Facebook
    • Partager sur Twitter

    gbl

      5 février 2019 à 14:46:41

      Tu devrais regarder la doc de QProgressBar, et en particulier la fonction setvalue() 

      NB: QTimer n'est pas une fonction mais une classe. 

            Pour un intervalle de 200 ms, c'est timer->setInterval(200);

      • Partager sur Facebook
      • Partager sur Twitter
        5 février 2019 à 15:28:23

        je galère la mdr les doc sont en anglai sje capte rien, j'ai essayer d'ecrire un truc, sa marche pas mais suis-je sur la bonne voie ?

        void C_cadre::on_BarreDeProgression_valueChanged(int value)
        {
            int valeur = this->ui->BarreDeProgression->value();
            this->ui->BarreDeProgression->setValue(valeur);
        }
        



        • Partager sur Facebook
        • Partager sur Twitter

        gbl

          5 février 2019 à 16:10:25

          Ah mon amis si tu n'aimes pas l'anglais il va falloir malheureusement arrêter l'informatique. Et par pitié, code en anglais AUSSI. Sinon

          • Ta fonction update on ne la voit pas
          • La syntaxe SIGNAL/SLOT est dépréciée

          Mais là à modifier la valeur d'un widget quand tu change sa valeur (donc sans son évènement valueChanged), il est possible de faire une boucle infinie.

          -
          Edité par markand 5 février 2019 à 16:11:31

          • Partager sur Facebook
          • Partager sur Twitter

          git is great because Linus did it, mercurial is better because he didn't.

            5 février 2019 à 16:24:45

            En supposant que ta progress bar ait un range entre 0 et 100 (valeurs par défaut,  setRange() pour le changer), il te suffit d'incrémenter la valeur que tu passes à setValue.

            connect(timer, &QTimer::timeout, this, &C_adre::update);
            
            void C_adre::update()
            {
               progressBar->setValue(progressBar->value() + 1);
            }



            • Partager sur Facebook
            • Partager sur Twitter
              6 février 2019 à 13:12:04

              oulala je comprends plus rien j'ai essayé autre choses… en tenant compte de vos conseil 
              #include "c_cadre.h"
              #include "ui_c_cadre.h"
              #include<QTimer>
              #include<QProgressBar>
              C_cadre::C_cadre(QWidget *parent) :
                  QMainWindow(parent),
                  ui(new Ui::C_cadre)
              
              {
              
              ui->setupUi(this);
              
                      Le_timer = new QTimer();
                      Le_timer->setInterval(50);
                      Le_timer->start();
                              QObject::connect(Le_timer,SIGNAL(timeout()),this,SLOT(top_timer()));
              
              
              
              
              
              
              }
              
              C_cadre::~C_cadre()
              {
                  delete ui;
              }
              
              
              
              
              void C_cadre::on_BarreDeProgression_valueChanged(int value)
              {
                  int L_position = ui->BarreDeProgression->value();
                  L_position++;
                  ui->BarreDeProgression->setValue(L_position);
              
              }
              
              • Partager sur Facebook
              • Partager sur Twitter

              gbl

                6 février 2019 à 13:54:45

                Si dans ton connect tu appelles on_BarreDeProgression_valueChanged ça devrait être bon.

                Là tu appelles une méthode inexistante.

                • Partager sur Facebook
                • Partager sur Twitter
                  6 février 2019 à 14:36:32

                  c'est par la qu'il y a un soucis ?

                      Le_timer = new QTimer();
                          Le_timer->setInterval(50);
                          Le_timer->start();
                                  QObject::connect(Le_timer,SIGNAL(timeout()),this,SLOT(C_cadre()));
                  • Partager sur Facebook
                  • Partager sur Twitter

                  gbl

                    6 février 2019 à 14:46:16

                    Dans ton connect tu dois lier le signal (ici timeout) au slot, donc à la fonction que tu veux appeler ! C_adre c'est ta classe.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      6 février 2019 à 15:26:01

                      Attend je vais d'abord aller m'entrainer sur SCRATCH c'est un bon langage pour moi ça.

                      non mais sérieux l'écriture est hyper galère avec le timer il y a 5 lignes et tout alors qu'ils aurait pu mettre un fonction delay(500); au lieu d'ecrire ce bordel.

                      du coup j'ai mis la fonction dans le connect j'ai pas du me tromper vu qu'il y en a qu'une mais j'y arrive pas.

                          Le_timer = new QTimer();
                              Le_timer->setInterval(200);
                              Le_timer->start();
                                      QObject::connect(Le_timer,SIGNAL(timeout()),this,SLOT(C_cadre::on_BarreDeProgression_valueChanged()));
                      
                      • Partager sur Facebook
                      • Partager sur Twitter

                      gbl

                        6 février 2019 à 16:28:49

                        Lu', 

                        non, ce n'est pas parce que tu n'y arrives pas qu'il s'agit d'un bordel. 

                        De plus ton problème n'est pas lié à la classe Qtimer mais à la compréhension du mécanisme signal/slot de Qt.

                        Pour ton problème, une solution à t'a déjà été donnée:

                        Maluna34 a écrit:

                        En supposant que ta progress bar ait un range entre 0 et 100 (valeurs par défaut,  setRange() pour le changer), il te suffit d'incrémenter la valeur que tu passes à setValue.

                        connect(timer, &QTimer::timeout, this, &C_adre::update);
                        
                        void C_adre::update()
                        {
                           progressBar->setValue(progressBar->value() + 1);
                        }
                        Il faut juste l'adapter (très légèrement) à ton cas. Pour plus d'infos
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Eug

                          6 février 2019 à 17:57:48

                          C'est déjà mieux au moins tu essaies d'appeler une méthode qui existe. Tu mélanges juste la vieille syntaxe de connexion Qt et la nouvelle.

                          Soit :

                          QObject::connect(Le_timer,SIGNAL(timeout()),this,SLOT(on_BarreDeProgression_valueChanged()));

                          ou

                          QObject::connect(Le_timer, &QTimer::timeout, this, &C_adre::on_BarreDeProgression_valueChanged);

                          La deuxième est conseillée. :)


                          -
                          Edité par Maluna34 6 février 2019 à 17:58:13

                          • Partager sur Facebook
                          • Partager sur Twitter
                            7 février 2019 à 10:18:30

                            Avant de dire que c'est du bordel, renseigne toi sur la programmation orientée évènements. Qt est loin d'être bordélique.
                            • Partager sur Facebook
                            • Partager sur Twitter

                            git is great because Linus did it, mercurial is better because he didn't.

                            QTimer

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown