Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Qt] Problème dans le TP

Une amélioration du générateur de fonctionne pa...

Sujet résolu
    30 mai 2008 à 2:21:09

    Bonjour à tous !

    Je viens de terminer le TP du générateur de classes dans le cours C++.
    Je suis rendu aux améliorations et... je bloque :'( .

    Voilà ma partie de code qui ne fonctionne pas (Je sais que le problème se trouve là) :

    m_protectionVsInclusions = new QCheckBox("&Protéger le HEADER contre les inclusions multiples.");
        m_protectionVsInclusions->setChecked(true);
        m_headerGuard = new QLineEdit();
            m_headerGuard->setValidator(new QRegExpValidtor(QRegExp("^[A-Z 0-9 _]+$"), this)); //Cette ligne fait en sorte que mon champ n'accepte que les majuscules, les chiffres et les "_"
    
        //C'est cette ligne qui me pose problème
            connect(m_nomClasse, SIGNAL(textEdited(QString)), this, SLOT(setHeaderGuard(QString)));
    



    Plus bas, j'ai :
    void FenPrincipale::setHeaderGuard(QString &newHG)
    {
        m_headerGuard->setText(newHG);
    
        //Je vais rajouter du code ici
    }
    



    Bien sur, ces 2 lignes ensembles reviennent au même que :

    connect(m_nomClasse, SIGNAL(textEdited(QString)), m_headerGuard, SLOT(setText(QString)));
    


    Et ça marche très bien avec la deuxième façon.

    Pourtant, avec la première façon, Il ne se passe rien...
    (J'espère que vous avez deviné ce que fais mon code).


    Quelqu'un peut m'aider :euh: ?


    Le compilateur ne fais remarquer aucune erreur, toutes les "#include" ont été fait... Je suis mal là.
    • Partager sur Facebook
    • Partager sur Twitter
      30 mai 2008 à 3:43:17

      il manquerait pas la macro Q_OBJECT quelquepart ?
      • Partager sur Facebook
      • Partager sur Twitter
        30 mai 2008 à 14:48:51

        Citation : minirop

        il manquerait pas la macro Q_OBJECT quelquepart ?



        Non minirop. Dans mon header, tout est là, incluant le la macro Q_OBJECT...
        J'ai déjà vérifié tout ça avant de poster ce message.

        Moi, j'ai une politique :

        Citation : Vincenzo-88

        Toujours vérifier toutes les possibilités d'erreurs avant de poster un message sur un quelconque forum. Tel est ma politique !



        Alors voilà... Ce que tu viens de dire, je l'avais nécessairement vérifié.
        • Partager sur Facebook
        • Partager sur Twitter
          30 mai 2008 à 15:19:41

          Montre nous le code au pire
          • Partager sur Facebook
          • Partager sur Twitter
            30 mai 2008 à 21:13:54

            Alors voilà les fichiers qui pourraient avoir un rapport avec le problème :

            #ifndef FENPRINCIPALE_HEADER
            #define FENPRINCIPALE_HEADER
            
            #include <QApplication>
            #include <QCheckBox>
            #include <QDateEdit>
            #include <QFormLayout>
            #include <QGridLayout>
            #include <QGroupBox>
            #include <QHBoxLayout>
            #include <QLineEdit>
            #include <QMessageBox>
            #include <QPushButton>
            #include <QRegExpValidator>
            #include <QTextEdit>
            #include <QVBoxLayout>
            #include <QWidget>
            
            #include "ClasseFinale.h"
            
            
            class FenPrincipale : public QWidget
            {
                Q_OBJECT
            
                public :
                    FenPrincipale();
            
            
                private slots :
                    void genererHeader();
                    void setHeaderGuard(QString &newHG); //Le slot qui fait défaut.
            
            
                private :
                        //Dans la boîte "définition de la classe"
                    QGroupBox *m_definitionClasseBox;
                        QLineEdit *m_nomClasse;
                        QLineEdit *m_nomMere;
            
                        //Dans la boîte "options"
                    QGroupBox *m_optionsBox;
                        QCheckBox *m_protectionVsInclusions;
                            QLineEdit *m_headerGuard;
                        QCheckBox *m_genererConstructeur;
                        QCheckBox *m_genererDestructeur;
            
                        //Dans la boîte "commentaires"
                    QGroupBox *m_commentairesBox;
                        QLineEdit *m_auteur;
                        QDateEdit *m_date;
                        QTextEdit *m_role;
            };
            
            #endif //FENPRINCIPALE_HEADER
            


            #include "FenPrincipale.h"
            
            FenPrincipale::FenPrincipale() : QWidget()
            {
                setWindowTitle("Générateur de classes C++");
            
            
                QVBoxLayout *vLayout1 = new QVBoxLayout();
                {
                    QVBoxLayout *vLayout2 = new QVBoxLayout();
                    {
                        m_definitionClasseBox = new QGroupBox("Définition de la classe");
                            QFormLayout *formLayout1 = new QFormLayout();
                            {
                                m_nomClasse = new QLineEdit();
                                    m_nomClasse->setInputMask("");
                                m_nomMere = new QLineEdit();
            
                                formLayout1->addRow("&Nom de la classe :", m_nomClasse);
                                formLayout1->addRow("Classe &mère :", m_nomMere);
                                    formLayout1->setFormAlignment(Qt::AlignVCenter);
                                    formLayout1->setLabelAlignment(Qt::AlignRight);
                                    m_definitionClasseBox->setLayout(formLayout1);
                            }
            
                        m_optionsBox = new QGroupBox("Options");
                            QGridLayout *gLayout = new QGridLayout();
                            {
                                m_protectionVsInclusions = new QCheckBox("&Protéger le HEADER contre les inclusions multiples");
                                    m_protectionVsInclusions->setChecked(true);
                                    m_headerGuard = new QLineEdit();
                                        m_headerGuard->setValidator(new QRegExpValidator(QRegExp("^[A-Z_]+$"), this));
                                        connect(m_nomClasse, SIGNAL(textEdited(QString)), this, SLOT(setHeaderGuard(QString)));
            
                                m_genererConstructeur = new QCheckBox("Générer un &constructeur par défaut");
                                m_genererDestructeur = new QCheckBox("Générer un &destructeur");
            
                                gLayout->addWidget(m_protectionVsInclusions, 0, 0, 1, 2);
                                    gLayout->addWidget(m_headerGuard, 0, 2);
                                gLayout->addWidget(m_genererConstructeur, 1, 0, 1, 2);
                                gLayout->addWidget(m_genererDestructeur, 2, 0, 1, 2);
                                    m_optionsBox->setLayout(gLayout);
                            }
            
                        m_commentairesBox = new QGroupBox("Ajouter des commentaires");
                            m_commentairesBox->setCheckable(true);
                            m_commentairesBox->setChecked(false);
            
                            QFormLayout *formLayout2 = new QFormLayout();
                            {
            
                                m_auteur = new QLineEdit();
                                m_date = new QDateEdit();
                                    m_date->setDate(QDate::currentDate());
                                m_role = new QTextEdit();
            
                                formLayout2->addRow("&Auteur :", m_auteur);
                                formLayout2->addRow("Da&te :", m_date);
                                formLayout2->addRow("&Role :", m_role);
                                    formLayout2->setFormAlignment(Qt::AlignVCenter);
                                    formLayout2->setLabelAlignment(Qt::AlignRight);
                                    m_commentairesBox->setLayout(formLayout2);
                            }
            
            
            
                        vLayout2->addWidget(m_definitionClasseBox);
                        vLayout2->addWidget(m_optionsBox);
                        vLayout2->addWidget(m_commentairesBox);
                    }
            
            
                    QHBoxLayout *hLayout = new QHBoxLayout();
                    {
                        QPushButton *bGenerer = new QPushButton("&Générer le HEADER");
                            connect(bGenerer, SIGNAL(clicked()), this, SLOT(genererHeader()));
                        QPushButton *bQuitter = new QPushButton("&Quitter");
                            connect(bQuitter, SIGNAL(clicked()), qApp, SLOT(quit()));
            
                        hLayout->addWidget(bGenerer);
                        hLayout->addWidget(bQuitter);
                    }
                    vLayout1->addLayout(vLayout2);
                    vLayout1->addLayout(hLayout);
                        setLayout(vLayout1);
                }
            }
            
            
            
            void FenPrincipale::genererHeader()
            {
                if (m_nomClasse->text().isEmpty())
                {
                    QMessageBox::critical(this, "Erreur", "Veuillez entrer un nom de classe");
                    return;
                }
            
            
                QString codeFinal;
            
                if (m_commentairesBox->isChecked())
                {
                    codeFinal += "/*\n";
                    codeFinal += "Auteur : " + m_auteur->text() + "\n";
                    codeFinal += "Date : " + m_date->date().toString("dddd le d MMMM yyyy") + "\n\n";
                    codeFinal += "Role :\n";
                    codeFinal += m_role->toPlainText() + "\n";
                    codeFinal += "*/\n\n\n";
                }
            
                if (m_protectionVsInclusions->isChecked())
                {
                    codeFinal += "#ifndef " + m_nomClasse->text().toUpper() + "_HEADER\n";
                    codeFinal += "#define " + m_nomClasse->text().toUpper() + "_HEADER\n\n\n";
                }
            
                codeFinal += "class " + m_nomClasse->text();
                if (!m_nomMere->text().isEmpty())
                {
                    codeFinal += " : public " + m_nomMere->text();
                }
                codeFinal += "\n{\n";
                codeFinal += "    public :\n";
            
                if (m_genererConstructeur->isChecked())
                {
                    codeFinal += "        " + m_nomClasse->text() + "();\n\n";
                }
                if (m_genererDestructeur->isChecked())
                {
                    codeFinal += "        ~" + m_nomClasse->text() + "();\n\n";
                }
            
                codeFinal += "\n";
            
                codeFinal += "    protected :\n\n\n";
                codeFinal += "    private : \n\n\n";
            
                codeFinal += "};";
            
            
                if (m_protectionVsInclusions->isChecked())
                {
                    codeFinal += "\n\n\n#endif //" + m_nomClasse->text().toUpper() + "_HEADER\n";
                }
            
            
                ClasseFinale *newFen = new ClasseFinale(codeFinal, this);
                newFen->exec();
            }
            
            
            
            void FenPrincipale::setHeaderGuard(QString &newHG)
            {
                m_headerGuard->setText(newHG);
            }
            


            Tous mes autres fichiers ne PEUVENT pas avoir de rapport avec mon problème, je n'ai donc aucune raison de les afficher ici.

            [EDIT]
            Les "{}" placéesdans mon "FenPrincipale.cpp" ne sont là que pour mieux structurer mon code en "blocs" spécifiques. Ils ne représentent aucune boucle ni aucune condition, vous n'avez donc pas à vous en occuper. Vous comprendrez que chaque bloc représente 1 layout initialisé.

            Vous ne trouvez pas que mon code à l'ai bien oranisé ? ^^
            • Partager sur Facebook
            • Partager sur Twitter
              30 mai 2008 à 22:28:00

              Dans le connect essaye de mettre le symbole '&' devant :

              /* ... */ this, SLOT(setHeaderGuard(QString&))); /* ... */

              • Partager sur Facebook
              • Partager sur Twitter
                31 mai 2008 à 4:26:07

                Ça n'a malheureusement aucun effet...
                • Partager sur Facebook
                • Partager sur Twitter
                  31 mai 2008 à 8:56:09

                  Moi j'ai à peu près le même problème:

                  connect(myProtections, SIGNAL(stateChanged(bool)), myHeader, SLOT(setEnabled(bool)));

                  Pourtant quand je fais directement: myHeader->setEnabled(false);
                  par exemple, le QLineEdit devient grisé. Avec la première méthode, ça ne marche pas ! Help !

                  EDIT: Pour ton problème, je ne sais pas. Essaye de mettre le symbole '&' pour le signal & le slot pour voir si ça marche.

                  EDIT2: En lisant la doc, j'ai vu que le signal textEdited est obslete et celle qui est recommandée est textModified(QString&) :)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    31 mai 2008 à 17:12:28

                    Merci pour les conseils Midoagent47, mais le signal "textModified(QString&)" n'existe pas, tu voulais peut-être dire "textChanged(QString&)", mais il y a une différence entre les 2.

                    textEdited(QString&) envoie le signal quand l'utilisateur du programme change le contenu du QLineEdit,

                    Tandis que

                    textChanged(QString&) envoie le signal quand le contenu du QLineEdit est modifié, peut importe de quelle façon.


                    Pour ton problème de QLineEdit non grisé, au lieu de connecter le SLOT(setEnabled(bool)) au SIGNAL(stateChanged(bool)), connecte le plutôt à SIGNAL(toggled(bool)) ;) .
                    Avec le stateChanged(bool), chez moi non plus ça ne marchais pas, par contre, j'ai été voir dans la classe parente de QCheckBox et j'ai vu le signal toggled(bool). Ce signal, je l'avais déjà utilisé dans un de mes programmes et il fonctionnait parfaitement.


                    Pour le reste, je vais vérifier si mon SLOT perso est bien appelé. Je vais vous faire part du résultat pour éviter que vous cherchiez partout continuellement. Comme ça, les recherches vont avancer plus rapidement.


                    [EDIT]
                    Alors là, j'y croit pas !
                    Tout mon problème ne venait que du fait que mon slot appelait une référence et que le SIGNAL envoyait déjà une référence :waw: !


                    Avoir su que c'était ça mon problème, je n'aurait jamis posté ce message !

                    PROBLÈME RÉSOLU !
                    • Partager sur Facebook
                    • Partager sur Twitter
                      31 mai 2008 à 17:58:19

                      Merci pour ta réponse aussi. Vive Qt !
                      • Partager sur Facebook
                      • Partager sur Twitter
                        7 août 2008 à 12:54:34

                        Bonjour,

                        J'ai exactement le même problème et je n'arrive pas à le résoudre...

                        Pourrait tu mieux expliquer comment tu as réussi à le résoudre ?

                        Merci d'avance
                        • Partager sur Facebook
                        • Partager sur Twitter

                        [Qt] Problème dans le TP

                        × 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