Partage
  • Partager sur Facebook
  • Partager sur Twitter

Comment utiliser le "connect"

Sujet résolu
    17 mars 2019 à 22:54:31

    Bonjour,

    J'ai attentivement suivi le cours QT, je cherche aussi des solutions sur internet depuis 16h, mais je suis toujours bloqué.

    Le problèmes est que je ne parviens pas à cibler le receiver du "connect"

    QObject::connect(bouton1, SIGNAL (clicked()), ICI, SLOT (clicB1()));

    A la place de "ici", je ne sais quoi mettre ? "this", "qApp" ? A noter que la ligne "connect" et sur la même page (main.cpp) que la fonction "void clicB1" qui est :

    void MaFenetre::clicB1()
    {
        QMessageBox::information(this, "Enchanté.", "Salut");
    }

    Rien ne se produit lorsque je clique sur le bouton.

    Merci par avance ! :)


    • Partager sur Facebook
    • Partager sur Twitter
      17 mars 2019 à 22:59:14

      Bonsoir

      dans ce cas, tu dois mettre le nom du pointeur du type MaFenetre à la place de ICI

      Tu as un pointeur qui pointe vers un élément de type MaFentre (qui est une classe)

      Tu mets ce pointeur

      Il me semble que c'est this dans ton cas si ta ligne 

      QObject::connect(bouton1, SIGNAL (clicked()), ICI, SLOT (clicB1()));

      est dans une de tes fonctions membres de ta classe MaFenetre.

      -
      Edité par pseudo-simple 17 mars 2019 à 23:01:50

      • Partager sur Facebook
      • Partager sur Twitter
        17 mars 2019 à 23:05:33

        Merci de la réponse !

        Lorsque je remplace "ici" par "this", il m'indique que "this" est hors d'une fonction membre non statique ("invalid use of 'this' outside of a non-static member function")

        -
        Edité par IlianAzz 17 mars 2019 à 23:09:31

        • Partager sur Facebook
        • Partager sur Twitter
          17 mars 2019 à 23:08:07

          essaie de remplacer par "this" plutôt.

          Je ne suis pas sûr car je n'ai pas ton code complet.

          take care

          -
          Edité par pseudo-simple 17 mars 2019 à 23:10:24

          • Partager sur Facebook
          • Partager sur Twitter
            17 mars 2019 à 23:13:34

            Voici :

            #include <QApplication>
            #include <QTranslator>
            #include <QLocale>
            #include <QLibraryInfo>
            #include <QLabel>
            #include "MaFenetre.h"
            
            
            int main(int argc, char *argv[])
            {
            
                QApplication app(argc, argv);
            
                QString locale = QLocale::system().name().section('_', 0, 0);
                QTranslator translator;
                translator.load(QString("qt_") + locale, QLibraryInfo::location(QLibraryInfo::TranslationsPath));
                app.installTranslator(&translator);
            
            
                MaFenetre fenetre;
            
                //------------------Création variables //------------------
            
                // Strings
                QString rep1 = "Chapitre 1";
                QString rep2 = "Chapitre 2";
                QString rep3 = "Chapitre 3";
                QString rep4 = "Chapitre 4";
                QString rep5 = "Chapitre 5";
                QString nQ = "0";
            
                // Layout
                QGridLayout *layoutPrincipal = new QGridLayout;
                QGridLayout *layoutVie = new QGridLayout;
                QGridLayout *layoutCentre = new QGridLayout;
            
                // Textes
                QLabel *vieRestantesTxt = new QLabel("Vies restantes");
                QLabel *question = new QLabel("mmmmm");
            
                // LCD numer
                QLCDNumber *vieRestantesNum = new QLCDNumber;
            
                // Bouttons
                QPushButton *bouton1 = new QPushButton(rep1);
            
                QPushButton *bouton2 = new QPushButton(rep2);
                QPushButton *bouton3 = new QPushButton(rep3);
                QPushButton *bouton4 = new QPushButton(rep4);
                QPushButton *bouton5 = new QPushButton(rep5);
            
                bouton2->setEnabled(false);
                bouton3->setEnabled(false);
                bouton4->setEnabled(false);
                bouton5->setEnabled(false);
            
            
                //------------------ Affectation //------------------
            
                fenetre.setLayout(layoutPrincipal);
            
                // Layout Principal
                layoutPrincipal->addLayout(layoutVie, 6, 6);
                layoutPrincipal->addLayout(layoutCentre, 1, 0, 4 ,6);
            
                // Layout centre
                layoutCentre->addWidget(question, 2, 1, 1, 5);
            
                layoutCentre->addWidget(bouton1, 4, 1);
                layoutCentre->addWidget(bouton2, 4, 2);
                layoutCentre->addWidget(bouton3, 4, 3);
                layoutCentre->addWidget(bouton4, 4, 4);
                layoutCentre->addWidget(bouton5, 4, 5);
            
            
                // Layout Vie
                layoutVie->addWidget(vieRestantesTxt, 0, 0, Qt::AlignCenter);
                layoutVie->addWidget(vieRestantesNum, 1, 0, Qt::AlignCenter);
            
                //------------------ Detect Boutons //------------------
                QObject::connect(bouton1, SIGNAL (clicked()), this, SLOT (clicB1()));
                QObject::connect(bouton2, SIGNAL (clicked()), qApp, SLOT (clicB2()));
                QObject::connect(bouton3, SIGNAL (clicked()), qApp, SLOT (clicB3()));
                QObject::connect(bouton4, SIGNAL (clicked()), qApp, SLOT (clicB4()));
                QObject::connect(bouton5, SIGNAL (clicked()), qApp, SLOT (clicB5()));
            
                fenetre.show();
                return app.exec();
            }
            
            
            void MaFenetre::clicB1()
            {
                QMessageBox::information(this, "Enchanté Ilian.", "Salut ILian,");
            }
            void MaFenetre::clicB2()
            {
                
            }
            void MaFenetre::clicB3()
            {
            
            }
            void MaFenetre::clicB4()
            {
            
            }
            void MaFenetre::clicB5()
            {
            
            }



            • Partager sur Facebook
            • Partager sur Twitter
              17 mars 2019 à 23:19:56

              Salut tout le monde,

              en fait le prototype de la méthode statique connect est:

              QObject::connect(émetteur, signale, récepteur, slot); 

              alors le slot est une fonction appartenant au pointeur récepteur qui doit-être appelé lors de l'émission du signale.

              Note: ton slot clicB1() doit être une fonction membre de l'objet récepteur 

              • Partager sur Facebook
              • Partager sur Twitter

              Ton présent détermine ton futur et la connaissance te placera au dessus de ta génération .

                17 mars 2019 à 23:20:32

                @IlianAzz

                Je t'encourage à regrouper tous tes connect's dans une seule fonction membre de ta classe MaFenetre. Tu appelles alors cette nouvelle fonction à la place de tes 5 appels dans ton main.

                Ainsi, de manière assurée, tu pourras mettre this partout dans tous ces 5 connect car tes fonctions clicBi..(i=0..4) sont des fonctions membres et tout fonctionnera bien alors.

                take care

                PS : salut El-JOS

                -
                Edité par pseudo-simple 17 mars 2019 à 23:24:33

                • Partager sur Facebook
                • Partager sur Twitter
                  18 mars 2019 à 8:21:40

                  La fonction clicB1 étant dans la classe MaFenetrre, il faut passer un pointeur de type MaFenetre. Donc ici l'adresse de ta variable fenetre. ;) On est pas obligé de passer this forcément.

                  QObject::connect(bouton1, SIGNAL (clicked()), &fenetre, SLOT (clicB1()));

                  -
                  Edité par Maluna34 18 mars 2019 à 8:22:36

                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 mars 2019 à 9:26:19

                    EL-jos : Oui, c'est l'erreur que me donne QT ! 

                    YES, man : C'est sur que niveau organisation c'est pas trop ça...

                    Maluna34 : Ok oui, ça fonctionne et j'ai compris pourquoi, mon premier choix avait été "fenetre", mais il manquait simplement le "&" devant... 

                    Merci a vous trois ! :D

                    Edit : Le problème que j'ai quand je souhaite organiser, c'est que après avoir cree mes Widgets dans "fenetre.h", je n'arrive pas à y acceder dans main.cpp

                    -
                    Edité par IlianAzz 18 mars 2019 à 9:44:02

                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 mars 2019 à 14:51:18

                      Dans un projet Qt, il est d'usage que le main ne contienne que :

                      int main(int argc, char *argv[])
                      {
                          QApplication app(argc, argv);
                          MaFenetre fenetre;
                          fenetre.show();
                      
                          return app.exec();
                      }

                      Après c'est dans le constructeur de ta classe principale que tu construis ta fenêtre. :)

                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 mars 2019 à 17:23:03

                        Juste pour info, l'utilisation de SIGNAL et SLOT est une relique de Qt4, il est préférable de faire sans: https://wiki.qt.io/New_Signal_Slot_Syntax

                        • Partager sur Facebook
                        • Partager sur Twitter
                          19 mars 2019 à 20:29:27

                          Maluna34 : J'aimerais bien laisser le main "vide" mais j'ai un problème pour faire appel à la "fenetre" dans le mafenetre.cpp. Il dit que la variable "fenetre" n'est pas déclarée. Le problème est que dans le cours, pendant les explications sur le Layout, tout est fait dans le main.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            20 mars 2019 à 0:03:22

                            "this" est ton ami. ;)

                            Ou encore mieux, rien, car dans une instance de fenêtre, le contexte par défaut, c'est la fenêtre elle-même.KISS (Keep It Simple and Stupid)

                            • Partager sur Facebook
                            • Partager sur Twitter
                            Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                              20 mars 2019 à 15:09:11

                              Effecivement... Merci beaucoup !
                              • Partager sur Facebook
                              • Partager sur Twitter

                              Comment utiliser le "connect"

                              × 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