Partage
  • Partager sur Facebook
  • Partager sur Twitter

[QT] Encore une question sur les signal et les slot

Sujet résolu
    5 juillet 2007 à 17:26:45

    Salut, j'ai une question. Je vous montre d'abord du code pour vous expliquer :

    MainApp.h


    #include <QWidget>
    #include <QObject>
    #include <QPushButton>

    class MainApp : public QObject
    {
          Q_OBJECT
         
          public:
                 MainApp(QWidget *parent = 0) {m_value = 0;}
                 int value() const { return m_value; }
                 
          private:
                  int m_value;
          public slots:
                 void setValue(int);
          signals:
                  void valueChanged(int newValue);
                 
    };
     


    MainApp.cpp

    #include "MainApp.h"

    void MainApp::setValue(int value)
    {
         if(m_value != value)
         {
                    m_value = value;
                    emit valueChanged(value);
         }
    }
     


    Maintenant, je vais vous montrer 2 main.cpp différants:

    1° main.cpp


    #include <QApplication>
    #include <QWidget>
    #include <QPushButton>
    #include <fstream>
    #include "MainApp.h"

    using namespace std;

    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);

        MainApp a, b;
        ofstream fichier("fichier.txt");
        QWidget window;
        window.resize(400, 230);
       
        QPushButton hello("Hello world!", &window);
        hello.setGeometry(100, 100, 200, 30);
        QObject::connect(&hello, SIGNAL(clicked()), &app, SLOT(quit()));
        QObject::connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int)));
       
        a.setValue(20);
        fichier << "a.setValue = " << a.value() << endl << "b.setValue = " << b.value() << endl;
       
        fichier << endl;
       
        b.setValue(50);
        fichier << "a.setValue = " << a.value() << endl << "b.setValue = " << b.value() << endl;
       
       
       
        fichier.close();
        window.show();
        return app.exec();
    }


    2° main.cpp


    #include <QApplication>
    #include <QWidget>
    #include <QPushButton>
    #include <fstream>
    #include "MainApp.h"

    using namespace std;

    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);

        MainApp a, b;
        ofstream fichier("fichier.txt");
        QWidget window;
        window.resize(400, 230);
       
        QPushButton hello("Hello world!", &window);
        hello.setGeometry(100, 100, 200, 30);
        QObject::connect(&hello, SIGNAL(clicked()), &app, SLOT(quit()));
        QObject::connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int)));
       
        a.setValue(20);
        fichier << "a.setValue = " << a.value() << endl << "b.setValue = " << b.value() << endl;
       
        fichier << endl;
       
        b.setValue(50);
        fichier << "a.setValue = " << a.value() << endl << "b.setValue = " << b.value() << endl;
       
        fichier << endl;
       
        a.setValue(20);
        fichier << "a.setValue = " << a.value() << endl << "b.setValue = " << b.value() << endl;
       
       
        fichier.close();
        window.show();
        return app.exec();
    }
     


    Quand je compile :
    le 1e main.cpp, j'obtiens :
    a.setValue = 20
    b.setValue = 20

    a.setValue = 20
    b.setValue = 50


    le 2e main.cpp, j'obtiens:
    a.setValue = 20
    b.setValue = 20

    a.setValue = 20
    b.setValue = 50

    a.setValue = 20
    b.setValue = 50


    Pourquoi je n'obtiens pas avec le 2e main.cpp :
    a.setValue = 20
    b.setValue = 20

    a.setValue = 20
    b.setValue = 50

    a.setValue = 20
    b.setValue = 20 //ICI


    Merci de vos réponses.
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      5 juillet 2007 à 17:47:01

      Tout simplement à cause de ça :

      void MainApp::setValue(int value)
      {
           if(m_value != value)
           {
                      m_value = value;
                      emit valueChanged(value);
           }
      } 


      Avant le 3e appel à setValue, a.value() == 20. Or, tu fais a.setValue(20). Tu as donc m_value == value, donc rien ne se passe.

      Pour bien t'en rendre compte, remplace le dernier a.setValue(20) par a.setValue(30), par exemple. Tu auras comme sortie:

      a.setValue = 20
      b.setValue = 20

      a.setValue = 20
      b.setValue = 50

      a.setValue = 30
      b.setValue = 30
      • Partager sur Facebook
      • Partager sur Twitter
        5 juillet 2007 à 17:58:40

        Et j'ai encore une question : si je fait
        QObject::connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int)));
            QObject::connect(&b, SIGNAL(valueChanged(int)), &a, SLOT(setValue(int)));


        et que je mets :
        a.setValue(45);
        b.setValue(65);
         


        Dans le 1er cas : a.setValue = b.setValue = 45
        Dans le 2e cas : a.setValue = b.setValue = 45

        C'est ça ou ça n'existe pas?

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          5 juillet 2007 à 18:03:44

          :euh: T'as changé quoi ? Tu as connecté 2 fois le même signal au même slot là.
          • Partager sur Facebook
          • Partager sur Twitter
            5 juillet 2007 à 18:05:55

            J'ai édité. Reregarde les lignes de codes.
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              5 juillet 2007 à 18:11:44

              Dans ce cas, on va le faire ligne par ligne :

              a.setValue(45);


              La valeur actuelle de a est différente de 45, donc on la fixe à 45, puis on émet le signal valueChanged(int). Ce signal est connecté au slot setValue(int) de b. Donc ça appelle b.setValue(45).
              La valeur actuelle de b est différente de 45, donc on la fixe à 45, puis on émet le signal valueChanged(int). Ce signal est connecté au slot setValue(int) de a. Donc ça appelle a.setValue(45).
              La valeur actuelle de a est déjà 45, donc plus rien ne se passe.

              a.value() == 45 && b.value == 45;


              b.setValue(65);


              La valeur actuelle de b est différente de 65, donc on la fixe à 65, puis on émet le signal valueChanged(int). Ce signal est connecté au slot setValue(int) de a. Donc ça appelle a.setValue(65).
              La valeur actuelle de a est différente de 65, donc on la fixe à 65, puis on émet le signal valueChanged(int). Ce signal est connecté au slot setValue(int) de b. Donc ça appelle b.setValue(65).
              La valeur actuelle de b est déjà 65, donc plus rien ne se passe.

              a.value() == 65 && b.value == 65;
              • Partager sur Facebook
              • Partager sur Twitter
                5 juillet 2007 à 18:21:53

                Merci pour ton aide. C'est exactement la réponse que je voulais.
                • Partager sur Facebook
                • Partager sur Twitter

                [QT] Encore une question sur les signal et les slot

                × 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