Partage
  • Partager sur Facebook
  • Partager sur Twitter

Changer plusieurs fois le text au clic Qt

    7 août 2020 à 16:06:46

    Bonjour,

    J'ai une fenêtre où apparaisse un texte (QLabel) et un bouton (QPushButton). Je voudrais lorsque j’appuie sur ce bouton changer le texte du QLabel une première fois, et lorsque j’appuie une nouvelle fois sur ce même bouton que le texte change de nouveau, et ainsi de suite. Pour l'instant j'ai réussi à ce que cela change une fois en utilisant un slot "changertext"

    void MaFenetre::changertext(){
    
    label->setText("blabla");
    
    }

    en cherchant comment résoudre le problème de la seconde transition j'ai essayé de créer un compteur mais je n'y parviens pas non plus.

    Merci beaucoup!

    • Partager sur Facebook
    • Partager sur Twitter
      7 août 2020 à 18:04:24

      Salut,

      Le plus facile est, sans doute, de créer un tableau contenant les différentes valeurs, sous une forme qui pourrait être proche de

      QVector<QString> labelValues{{"Salut"},
                                   {"Hello"},
                                   {"Bonjourno"},
                                   /* bon, tu auras compris le principe, hein? */
                                };
      

      Puis, d'utiliser, effectivement, un compteur pour savoir où tu en es, ce qui amènera ton slot à  ressembler à quelque chose comme

      void MaFenetre::changertext(){
          /* on récupère le texte qui correspond au compteur */
          auto const & text = labelValues[compteur];
          /* on défini le texte du label grâce à cette valeur */
          label->setText(text);
          /* On incrémente le compteur  pour la fois d'après,
           * en veillant à rester dans l'intervalle [0, labelValues.size()[ 
           */
          ++ compteur;
          compteur %= labelValues.size();
       
      }



      • Partager sur Facebook
      • Partager sur Twitter
      Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
        7 août 2020 à 23:52:59

        Bonsoir,

        Merci beaucoup pour votre réponse. J'ai essayé votre code mais j'obtiens une erreur :

        ASSERT failure in QVector<T>::operator[]: "index out of range", file /usr/include/qt5/QtCore/qvector.h, line 448

        17:46:43: The program has unexpectedly finished.

        Je remet mon code au cas où (très probable) j'ai fait une erreur en essayant votre code:

            page3 = new QWidget();
            labelpage3 = new QLabel("blabla",page3);
            labelpage3 -> setWordWrap(true);
            QVector<QString> labelValues{{"Salut"},
                                         {"Hello"},
                                         {"Bonjourno"},
                                      };
            QPushButton *encore = new QPushButton("...",page3);
        
            QVBoxLayout *PAGE3 = new QVBoxLayout;
            PAGE3 -> addWidget(labelpage3);
            PAGE3 -> addWidget(encore);
            page3 -> setLayout(PAGE3);
        
            QObject::connect(encore , &QPushButton::clicked, this, &MaFenetre::changertext);
        
            stackedWidget -> addWidget(page3);
        void MaFenetre::changertext(int compteur){
            /* on récupère le texte qui correspond au compteur */
            auto const & text = labelValues[compteur];
            /* on défini le texte du label grâce à cette valeur */
            label->setText(text);
            /* On incrémente le compteur  pour la fois d'après,
             * en veillant à rester dans l'intervalle [0, labelValues.size()[
             */
            ++ compteur;
            compteur %= labelValues.size();
        
        }

        J'ai rajouté le int compteur dans les arguments du slot car sinon j'ai des erreurs car compteur n'est pas déclaré... C'est probablement de là que viens l'erreur mais je ne comprend pas pourquoi.

        Merci beaucoup.

        • Partager sur Facebook
        • Partager sur Twitter
          8 août 2020 à 5:24:14

          Le compteur et le tableau de valeurs devraient être des données membres de ta classe, ce qui leur donnerait une forme proche de

          class MaFenetre{
          public:
              MaFenetre(){ 
                  labelValues.push_back("Hello");
                  labelValues.push_back("Salut");
                  labelValues.push_back("Bonjourno");
              }
              /* toutes les fonctions publiques*/
          private:
              /* toutes les fonctions / données privées */
              int count{0};
              QVector<QString> labelValues;
              void changertext(){
                  /* on récupère le texte qui correspond au compteur */
                  auto const & text = labelValues[compteur];
                  /* on défini le texte du label grâce à cette valeur */
                  label->setText(text);
                  /* On incrémente le compteur  pour la fois d'après,
                   * en veillant à rester dans l'intervalle [0, labelValues.size()[
                   */
                  ++ compteur;
                  compteur %= labelValues.size();
              }
          };

          On pourrait aussi envisager d'utiliser des données statiques spécifiques à la fonction, mais cela n'apporterait pas grand chose ;)

          • Partager sur Facebook
          • Partager sur Twitter
          Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait

          Changer plusieurs fois le text au clic Qt

          × 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