Partage
  • Partager sur Facebook
  • Partager sur Twitter

SLOT() et pointeur

Sujet résolu
    6 juin 2008 à 22:46:39

    bonjour,

    j'en suis au chapitre "Les principaux widgets" et je souhaite avec la fenetre que j'ai créer précédemment faire que le bouton Envoyer soit Enabled si le champs nom est vide.
    Voici ce que j'ai fait :
    ...
    QObject::connect(nom, SIGNAL(textChanged(QString)), this, SLOT(retenirNom(QString)));
    ...
    }
    //fin de MaFenetre::MaFenetre():QWidget()
    
    void MaFenetre::retenirNom(QString valeurNom)
    {
        if(valeurNom.length()!=0)
        {
             envoyer->setEnabled(true);
        }
        else
        {
            envoyer->setEnabled(false);
        }
    }
    


    sauf que j'ai une erreur d'exécution. Et je trouve ça normal car la fonction retenirNom ne connais pas Envoyer.

    Comment puis-je faire, car je ne peux pas envoyer d'autres paramètres dans le slot retenirNom ?

    Merci
    • Partager sur Facebook
    • Partager sur Twitter
      6 juin 2008 à 23:36:06

      faut mettre la variable "envoyer" en tant que champ de ta classe MaFenetre
      • Partager sur Facebook
      • Partager sur Twitter
        7 juin 2008 à 8:27:46

        Je ne suis pas sûr d'avoir compris ta réponse. En effet si "envoyer" n'est pas dans la classe MaFenetre, j'aurais une erreur de compilation comme quoi "envoyer" n'est pas défini.

        De plus, je viens d'essayer quelque chose qui ne se fait pas (mais c'etait juste pour voir le résultat) : j'ai mis QPushButton *envoyer comme public et non plus comme private. Et là tout fonctionne, sauf que c'est TOUTE la fenetre qui devient enable et non pas le bouton envoyer. C'est pas normal, si ?
        • Partager sur Facebook
        • Partager sur Twitter
          7 juin 2008 à 16:32:24

          Dans ton MaFenetre.h tu dois mettre :
          private :
          QPushButton *envoyer;
          


          Et dans le constructeur de ta classe :
          envoyer = new QPushButton("Envoyer");
          


          De cette manière, ton QPushButton pourra être utilisé par toutes les fonctions de ta classe.
          • Partager sur Facebook
          • Partager sur Twitter
            8 juin 2008 à 8:47:39

            C'est exactement ce que j'ai fais. Voici mon code complet

            //main.cpp
            #include <QApplication>
            #include "fenetre.h"
            
            int main(int argc, char*argv[])
            {
                QApplication app(argc, argv);
            
                MaFenetre fenetre;
            
                fenetre.show();
            
                return app.exec();
            }
            


            //fenetre.h
            #ifndef DEF_FENETRE
            #define DEF_FENETRE
            
            
            #include <QApplication>
            #include <QPushButton>
            #include <QGridLayout>
            #include <QVBoxLayout>
            #include <QFormLayout>
            #include <QLineEdit>
            #include <QSpinBox>
            #include <QMessageBox>
            #include <QLabel>
            
            class MaFenetre:public QWidget
            {
                Q_OBJECT
            
                public:
                MaFenetre();
            
                public slots:
                void messageAbout();
                void messageAide();
                void messageEnvoyer();
                void retenirNom(QString);
            
                private:
                QPushButton *aide;
                QPushButton *envoyer;
                QPushButton *quitter;
                QPushButton *about;
                QGridLayout *layoutBouton;
            
                QLineEdit *nom;
                QLineEdit *prenom;
                QSpinBox *age;
                QFormLayout *layoutCoord;
            
                QFormLayout *layoutPrinc;
            
            };
            
            #endif
            


            //fenetre.cpp
            #include "fenetre.h"
            
            MaFenetre::MaFenetre():QWidget()
            {
                setWindowTitle("Exercice avec les layouts");
                setWindowIcon(QIcon("logo.png"));
            
                QLabel *titre = new QLabel("<center><strong>Formulaire à remplir</strong></center>");
                QLineEdit *nom = new QLineEdit;
                QLineEdit *prenom = new QLineEdit;
                QSpinBox *age = new QSpinBox;
                    age->setSuffix(" ans");
                    age->setRange(18, 80);
                QFormLayout *layoutCoord = new QFormLayout;
            
                layoutCoord->addRow(titre);
                layoutCoord->addRow("Votre &nom : ", nom);
                layoutCoord->addRow("Votre &prénom : ", prenom);
                layoutCoord->addRow("Votre â&ge : ", age);
            
            
                QPushButton *aide = new QPushButton("aide");
                aide->setCursor(Qt::PointingHandCursor);
                aide->setToolTip("ce bouton vous affiche une aide");
            
                QPushButton *about = new QPushButton("a Propos");
                about->setCursor(Qt::PointingHandCursor);
                about->setToolTip("ce bouton vous affiche la personne ayant fait ce logiciel");
            
                QPushButton *envoyer = new QPushButton("envoyer");
                envoyer->setCursor(Qt::PointingHandCursor);
                envoyer->setToolTip("ce bouton vous permet d'envoyer vos données");
            
                QPushButton *quitter = new QPushButton("quitter");
                quitter->setCursor(Qt::PointingHandCursor);
                quitter->setToolTip("ce bouton vous permet de fermer l'application");
            
                QGridLayout *layoutBouton = new QGridLayout;
            
                layoutBouton->addWidget(aide, 0, 0, 1, 1);
                layoutBouton->addWidget(envoyer, 0, 1, 1, 1);
                layoutBouton->addWidget(quitter, 0, 2, 1, 1);
                layoutBouton->addWidget(about, 1, 0, 1, 3);
            
            
                QFormLayout *layoutPrinc = new QFormLayout;
                layoutPrinc->addRow(layoutCoord);
                layoutPrinc->addRow(layoutBouton);
            
                setLayout(layoutPrinc);
            
            
                QObject::connect(aide, SIGNAL(clicked()), this, SLOT(messageAide()));
                QObject::connect(quitter, SIGNAL(clicked()), qApp, SLOT(quit()));
                QObject::connect(envoyer, SIGNAL(clicked()), this, SLOT(messageEnvoyer()));
                QObject::connect(about, SIGNAL(clicked()), this, SLOT(messageAbout()));
                QObject::connect(nom, SIGNAL(textChanged(QString)), this, SLOT(retenirNom(QString)));
            }
            
            
            void MaFenetre::retenirNom(QString valeurNom)
            {
                if(valeurNom.length()!=0)
                {
                     envoyer->setEnabled(true);
                }
                else
                {
                    envoyer->setEnabled(false);
                }
            }
            
            void MaFenetre::messageAide()
            {
                QMessageBox::information(this, "aide", "Il faut remplir les différents champs : <br /><strong>- nom<br />- prénom<br />- âge<br /></strong>et cliquer sur Envoyer");
            }
            
            void MaFenetre::messageEnvoyer()
            {
                QMessageBox::critical(this, "envoyer", "il est actuellement impossible de stocker les informations recueillies");
            }
            
            void MaFenetre::messageAbout()
            {
                QMessageBox::about(this, "a Propos", "Ce logiciel a été réalisé par<br /><strong>xxx</strong>");
            }
            
            • Partager sur Facebook
            • Partager sur Twitter
              9 juin 2008 à 8:50:30

              personne ne peut trouver mon erreur ???
              • Partager sur Facebook
              • Partager sur Twitter
                9 juin 2008 à 11:27:42

                Salut !

                Je pense avoir trouvé ton erreur : elle viendrait de ton fenetre.cpp
                Dans le fenetre.h, tu as :
                QPushButton *envoyer;
                

                Et dans le fentre.cpp, on retrouve lors de la déclaration de ton bouton la ligne :
                QPushButton *envoyer = new QPushButton("envoyer");
                

                En fait, tu redéclare le bouton ! Pour le programme, le pointeur envoyer appartient à la fonction MaFenetre, c'est à dire le constructeur !
                Il faut juste que tu utilises, lors de tes déclaration ceci :

                envoyer = new QPushButton("Envoyer", this);
                

                Tu crées ainsi ton bouton, qui appartient bien à ta classe et déclaré en tant que membre de la classe, et ensuite, tu peux l'utiliser à ta guise dans ta fonction ;)
                • Partager sur Facebook
                • Partager sur Twitter
                  9 juin 2008 à 20:49:31

                  Merci de ta réponse mais ce n'est pas la solution. J'ai toujours le même problème. Même en rajoutant this.

                  Une autre idée ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    9 juin 2008 à 21:23:03

                    tu as fait la meme chose pour tout les autres (QLineEdit *nom = new QLineEdit; QLineEdit *prenom = new QLineEdit;) ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      9 juin 2008 à 21:28:30

                      je l'ai fait pour tous les autres QPushButton mais QLineEdit ne peut pas prendre de this, si ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        9 juin 2008 à 21:39:35

                        renvois nous le code du constructeur modifier pour voir si tu as bien effectuer les modifications...

                        Et essaye un nettoyage du projet avant le prochain build (ou un rebuild)
                        • Partager sur Facebook
                        • Partager sur Twitter
                          9 juin 2008 à 21:52:34

                          Dans mon dossier fenetre, j'ai tout supprimé sauf fenetre.cbp, fenetre.h, fenetre.cpp, main.cpp et fenetre.workspace. Dans le dossier release, il n'y a plus que les 3 dll et logo.png

                          voici fenetre.cpp

                          #include "fenetre.h"
                          
                          MaFenetre::MaFenetre():QWidget()
                          {
                              setWindowTitle("Exercice avec les layouts");
                              setWindowIcon(QIcon("logo.png"));
                          
                              QLabel *titre = new QLabel("<center><strong>Formulaire à remplir</strong></center>");
                              QLineEdit *nom = new QLineEdit;
                              QLineEdit *prenom = new QLineEdit;
                              QSpinBox *age = new QSpinBox;
                                  age->setSuffix(" ans");
                                  age->setRange(18, 80);
                              QFormLayout *layoutCoord = new QFormLayout;
                          
                              layoutCoord->addRow(titre);
                              layoutCoord->addRow("Votre &nom : ", nom);
                              layoutCoord->addRow("Votre &prénom : ", prenom);
                              layoutCoord->addRow("Votre â&ge : ", age);
                          
                          
                              QPushButton *aide = new QPushButton("aide", this);
                              aide->setCursor(Qt::PointingHandCursor);
                              aide->setToolTip("ce bouton vous affiche une aide");
                          
                              QPushButton *about = new QPushButton("a Propos", this);
                              about->setCursor(Qt::PointingHandCursor);
                              about->setToolTip("ce bouton vous affiche la personne ayant fait ce logiciel");
                          
                              QPushButton *envoyer = new QPushButton("envoyer", this);
                              envoyer->setCursor(Qt::PointingHandCursor);
                              envoyer->setToolTip("ce bouton vous permet d'envoyer vos données");
                              envoyer->setEnabled(false);
                          
                              QPushButton *quitter = new QPushButton("quitter", this);
                              quitter->setCursor(Qt::PointingHandCursor);
                              quitter->setToolTip("ce bouton vous permet de fermer l'application");
                          
                              QGridLayout *layoutBouton = new QGridLayout;
                          
                              layoutBouton->addWidget(aide, 0, 0, 1, 1);
                              layoutBouton->addWidget(envoyer, 0, 1, 1, 1);
                              layoutBouton->addWidget(quitter, 0, 2, 1, 1);
                              layoutBouton->addWidget(about, 1, 0, 1, 3);
                          
                          
                              QFormLayout *layoutPrinc = new QFormLayout;
                              layoutPrinc->addRow(layoutCoord);
                              layoutPrinc->addRow(layoutBouton);
                          
                              setLayout(layoutPrinc);
                          
                          
                              QObject::connect(aide, SIGNAL(clicked()), this, SLOT(messageAide()));
                              QObject::connect(quitter, SIGNAL(clicked()), qApp, SLOT(quit()));
                              QObject::connect(envoyer, SIGNAL(clicked()), this, SLOT(messageEnvoyer()));
                              QObject::connect(about, SIGNAL(clicked()), this, SLOT(messageAbout()));
                              QObject::connect(nom, SIGNAL(textChanged(QString)), this, SLOT(retenirNom(QString)));
                          }
                          
                          void MaFenetre::retenirNom(QString valeurNom)
                          {
                              if(valeurNom.length()!=0)
                              {
                                  envoyer->setEnabled(true);
                              }
                              else
                              {
                                  envoyer->setEnabled(false);
                              }
                          }
                          
                          void MaFenetre::messageAide()
                          {
                              QMessageBox::information(this, "aide", "Il faut remplir les différents champs : <br /><strong>- nom<br />- prénom<br />- âge<br /></strong>et cliquer sur Envoyer");
                          }
                          
                          void MaFenetre::messageEnvoyer()
                          {
                              QMessageBox::critical(this, "envoyer", "il est actuellement impossible de stocker les informations recueillies");
                          }
                          
                          void MaFenetre::messageAbout()
                          {
                              QMessageBox::about(this, "a Propos", "Ce logiciel a été réalisé par<br /><strong>***</strong>");
                          }
                          
                          • Partager sur Facebook
                          • Partager sur Twitter
                            9 juin 2008 à 22:03:30

                            Citation : olivbarb

                            je l'ai fait pour tous les autres QPushButton mais QLineEdit ne peut pas prendre de this, si ?



                            J'avoue ne pas comprendre.

                            Dans le .h, tu crée un pointeur vers un objet du type que tu choisis (ici ca sera un QLineEdit).
                            Et dans le .cpp, tu le fait pointer vers un objet de type QLineEdit que tu viens de créer. Tordu hein ?

                            Comme tu as fait, les objets nom et prénom sont définis 2 fois. Ce qui fait planter le compilo en théorie.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              9 juin 2008 à 22:11:42

                              je fais ce que dit mateo dans son cours. C'est comme cela qu'il créé des widgets.

                              Par contre le pb ne vient pas de là. Si je supprime
                              envoyer->setEnabled(true);
                              
                              et que je le remplace par
                              QMessageBox::critical(this, "envoyer", "il est actuellement impossible de stocker les informations recueillies");
                              

                              dans la fonction retenirNom(), il n'y a plus d'erreur. Certes la fonction ne fait plus grand chose...mais il n'y a plus d'erreur
                              • Partager sur Facebook
                              • Partager sur Twitter
                                9 juin 2008 à 22:45:11

                                Salut,

                                Il me paraît clair que tu n'as pas compris comment fonctionnent les champs des classes ici. Tu n'as pas l'air d'être très à l'aise dans ce que tu fais pour le moment, et en particulier tu crois que l'erreur venait du this alors que pas du tout.

                                Voilà ce qu'il faut faire :

                                Dans le .h :
                                QPushButton *envoyer;

                                Dans le constructeur du .cpp :
                                envoyer = new QPushButton("Envoyer");

                                C'est comme ça que ça marche. Toi tu fais dans le .cpp :
                                QPushButton *envoyer = new QPushButton("Envoyer");

                                Ce qui revient à redéfinir envoyer. C'est mauvais.
                                • Partager sur Facebook
                                • Partager sur Twitter

                                If you'd like to join us, read "How do we work at OpenClassrooms"! :)

                                  10 juin 2008 à 8:30:25

                                  Excusez-moi, vous (mateo et bombadil) avez entièrement raison. C'est vrai, maintenant que j'ai réfléchi, c'était complètement stupide de faire ce que j'ai fais (heureusement vous êtes là).

                                  Comme tu disais mateo, c'est en faisant des erreurs que l'on progresse. Et celle là je ne suis plus près de la refaire.
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  SLOT() et pointeur

                                  × 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