Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Qt] Erreur lors de l'utilisation de QRegExpValidator

    2 janvier 2009 à 22:44:06

    Salut à tous,

    Voilà j'essaye d'utiliser QRegExpValidator dnas le but de stopper une méthose si une chaine de caractère contien un espace, mais je n'y arrive pas...

    Voilà le bout de code qui bug :
    // On vérifie que le nom de la classe ne comporte pas d'espace, sinon on arrête
          QRegExp reg();
          QRegExpValidator v(reg, 0);
          int pos = 0;
          
          reg.setPattern("\\S+");
          v.setRegExp(reg);
    
          if (v.validate(nom, pos) == FALSE)
          {
              QMessageBox::critical(this, "Erreur", "Le nom de la classe de doit pas contenir d'espace");
              return; // Arrêt de la méthode
          }
    

    Dans le .h j'ai bien inclu #include <QtGui> et déclaré QLineEdit *nom;.

    Voici ce qui apparait lors de la compilation :
    mingw32-make -f Makefile.Release
    mingw32-make[1]: Entering directory `C:/Documents and Settings/Aurelien/Bureau/Q
    t/ZeroClassGenerator'
    g++ -c -O2 -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT
    -DQT_DLL -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS
    _QMAIN -I"c:\Qt\4.4.3\include\QtCore" -I"c:\Qt\4.4.3\include\QtCore" -I"c:\Qt\4.
    4.3\include\QtGui" -I"c:\Qt\4.4.3\include\QtGui" -I"c:\Qt\4.4.3\include" -I"." -
    I"c:\Qt\4.4.3\include\ActiveQt" -I"release" -I"." -I"c:\Qt\4.4.3\mkspecs\win32-g
    ++" -o release\FenPrincipale.o FenPrincipale.cpp
    FenPrincipale.cpp: In member function `void FenPrincipale::genererCode()':
    FenPrincipale.cpp:97: error: no matching function for call to `QRegExpValidator:
    :QRegExpValidator(QRegExp (&)(), int)'
    c:/Qt/4.4.3/include/QtGui/../../src/gui/widgets/qvalidator.h:198: note: candidat
    es are: QRegExpValidator::QRegExpValidator(const QRegExpValidator&)
    c:/Qt/4.4.3/include/QtGui/../../src/gui/widgets/qvalidator.h:183: note:
            QRegExpValidator::QRegExpValidator(const QRegExp&, QObject*)
    c:/Qt/4.4.3/include/QtGui/../../src/gui/widgets/qvalidator.h:182: note:
            QRegExpValidator::QRegExpValidator(QObject*)
    FenPrincipale.cpp:100: error: request for member `setPattern' in `reg', which is
     of non-class type `QRegExp ()()'
    FenPrincipale.cpp:101: error: no matching function for call to `QRegExpValidator
    ::setRegExp(QRegExp (&)())'
    c:/Qt/4.4.3/include/QtGui/../../src/gui/widgets/qvalidator.h:188: note: candidat
    es are: void QRegExpValidator::setRegExp(const QRegExp&)
    FenPrincipale.cpp:103: error: no matching function for call to `QRegExpValidator
    ::validate(QLineEdit&, int&)'
    c:/Qt/4.4.3/include/QtGui/../../src/gui/widgets/qvalidator.h:186: note: candidat
    es are: virtual QValidator::State QRegExpValidator::validate(QString&, int&) con
    st
    mingw32-make[1]: *** [release/FenPrincipale.o] Error 1
    mingw32-make[1]: Leaving directory `C:/Documents and Settings/Aurelien/Bureau/Qt
    /ZeroClassGenerator'
    mingw32-make: *** [release] Error 2




    Merci d'avance!


    PS : Au cas où, tous les codes complets : (L'erreur est dans FenPrincipale.cpp)
    => main.cpp
    #include <QApplication>
    #include <QTranslator>
    #include <QLocale>
    #include <QLibraryInfo>
    
    #include "FenPrincipale.h"
    
    int main(int argc, char* argv[])
    {
        QApplication app(argc, argv);
        
        QString locale = QLocale::system().name();
        QTranslator translator;
        translator.load(QString("qt_") + locale, QLibraryInfo::location(QLibraryInfo::TranslationsPath));
        app.installTranslator(&translator);
    
        FenPrincipale fenetre;
        fenetre.show();
    
        return app.exec();
    }
    

    => FenPrincipale.h
    #ifndef DEF_FENPRINCIPALE
    #define DEF_FENPRINCIPALE
     
    #include <QtGui>
    
     
    class FenPrincipale : public QWidget
    {
           Q_OBJECT
           
        public:
    FenPrincipale();
        
        private slots: 
    void genererCode();
    
        private:
    QVBoxLayout *layoutPrincipale;
    QGroupBox *qGroupBox1;
    QFormLayout *defClasse;
    QLineEdit *nom;
    QLineEdit *classeMere;
    QGroupBox *qGroupBox2;
    QCheckBox *option1;
    QCheckBox *option2;
    QCheckBox *option3;
    QVBoxLayout *options;
    QGroupBox *qGroupBox3;
    QFormLayout *formulaire;
    QLineEdit *auteur;
    QDateEdit *date;
    QTextEdit *role;
    QPushButton *boutonGenerer;
    QPushButton *boutonQuitter;
    };
     
    #endif
    

    => FenPrincipale.cpp
    #include "FenPrincipale.h"
    #include "FenCodeGenere.h"
    
    // Constructeur
    FenPrincipale::FenPrincipale()
    {
       // Création Layout : principale
          layoutPrincipale = new QVBoxLayout;      
          
          
       // Création layout : Définition de la classe => defClasse
          qGroupBox1 = new QGroupBox("Définition de la classe :");// Création du groupebox
          qGroupBox1->setMaximumHeight(90);
          
    	  defClasse = new QFormLayout;	// Ajout d'un formulaire
          nom = new QLineEdit; // Définition des lignes de texts
          classeMere = new QLineEdit;
          
    	  defClasse->addRow("Nom : ", nom);	// Ajout des lignes dans le formulaire
    	  defClasse->addRow("Classe mère : ", classeMere);
    	  
     	  qGroupBox1->setLayout(defClasse); // Ajout du formulaire au GroupBox
     	  
     	  
       // Création layout : Options => options
          qGroupBox2 = new QGroupBox("Options :");// Création du groupebox
          qGroupBox2->setMaximumHeight(90);
          
          option1 = new QCheckBox("Protéger le Header contre les inclusions multiples", this); // Création des options à cocher
          option2 = new QCheckBox("Générer un constructeur pas défault", this);
     	  option3 = new QCheckBox("Générer un destructeur", this);
     	  
     	  options = new QVBoxLayout; // Création d'un Layout Vertical
     	  options->addWidget(option1); // Ajout des optionau Layout
     	  options->addWidget(option2);
     	  options->addWidget(option3);
     	  
     	  qGroupBox2->setLayout(options); // Ajout du layout dans le GroupBox
     	  
     	  
        // Création Layout : Commentraire => formulaire
          qGroupBox3 = new QGroupBox("Options :");// Création du groupebox
          qGroupBox3->setCheckable(true);
          qGroupBox3->setChecked(false);
          
          formulaire = new QFormLayout;	// Ajout d'un formulaire
          auteur = new QLineEdit; // Définition des lignes de texts
          date = new QDateEdit;
            date->setDate(QDate::currentDate());
          role = new QTextEdit;
          
          formulaire->addRow("Auteur :", auteur); // Ajout des lignes dans le formulaire
          formulaire->addRow("Date :", date);
          formulaire->addRow("Rôle :", role);
          
          qGroupBox3->setLayout(formulaire); // Ajout du formulaire au GroupBox
          
          
        // Création layout : Boutons => boutons
           QHBoxLayout *boutons = new QHBoxLayout; // Création du Layout
           
           boutonGenerer = new QPushButton("Générer !"); // Création des boutons
           boutonQuitter = new QPushButton("Quitter");
             boutons->setAlignment(Qt::AlignRight);
           
           boutons->addWidget(boutonGenerer); // Ajout des boutons au Layout
           boutons->addWidget(boutonQuitter);    
           
     	  
        // Ajout des Layout au Layout Principale...
          layoutPrincipale->addWidget(qGroupBox1);
          layoutPrincipale->addWidget(qGroupBox2);
          layoutPrincipale->addWidget(qGroupBox3);
          layoutPrincipale->addLayout(boutons);
    
          setLayout(layoutPrincipale);
          setWindowTitle("Zero Class Generator");
          resize(400, 450);
          
        // Slots
          QObject::connect(boutonQuitter, SIGNAL(clicked()), qApp, SLOT(quit()));  
          QObject::connect(boutonGenerer, SIGNAL(clicked()), this, SLOT(genererCode()));
    }                     
    
    // Slot genererCode
    void FenPrincipale::genererCode()
    {
        // On vérifie que le nom de la classe n'est pas vide, sinon on arrête
          if (nom->text().isEmpty())
          {
              QMessageBox::critical(this, "Erreur", "Veuillez entrer au moins un nom de classe");
              return; // Arrêt de la méthode
          }
          
        // On vérifie que le nom de la classe ne comporte pas d'espace, sinon on arrête
          QRegExp reg();
          QRegExpValidator v(reg, 0);
          int pos = 0;
          
          reg.setPattern("\\S+");
          v.setRegExp(reg);
    
          if (v.validate(nom, pos) == FALSE)
          {
              QMessageBox::critical(this, "Erreur", "Le nom de la classe de doit pas contenir d'espace");
              return; // Arrêt de la méthode
          }
          
    
        // Si tout va bien, on génère le code
          QString code;
    
          if (qGroupBox3->isChecked()) // On a demandé à inclure les commentaires
          {
              code += "/*\nAuteur : " + auteur->text() + "\n";
              code += "Date de création : " + date->date().toString() + "\n\n";
              code += "Rôle :\n" + role->toPlainText() + "\n*/\n\n\n";
          }
    
          if (option1->isChecked())
          {
              code += "#ifndef HEADER_" + nom->text().toUpper() + "\n";
              code += "#define HEADER_" + nom->text().toUpper() + "\n\n\n";
          }
     
          code += "class " + nom->text();
    
          if (!classeMere->text().isEmpty())
          {
              code += " : public " + classeMere->text();
          }
    
          code += "\n{\n    public:\n";
          if (option2->isChecked())
          {
              code += "        " + nom->text() + "();\n";
          }
          if (option3->isChecked())
          {
              code += "        ~" + nom->text() + "();\n";
          }
          code += "\n\n    protected:\n";
          code += "\n\n    private:\n";
          code += "};\n\n";
    
          if (option1->isChecked())
          {
              code += "#endif\n";
          }
    
    
        // On crée puis affiche la fenêtre qui affichera le code généré, qu'on lui envoie en paramètre
          FenCodeGenere *fenetreCode = new FenCodeGenere(code, this);
          fenetreCode->exec();
    }
    

    => FenCodeGenere.h
    #ifndef HEADER_FENCODEGENERE
    #define HEADER_FENCODEGENERE
    
    #include <QtGui>
    
    class FenCodeGenere : public QDialog
    {
    	public:
    		FenCodeGenere(QString &code, QWidget *parent);
    
    	private:
            QTextEdit *codeGenere;
            QPushButton *fermer;
    };
    
    
    #endif
    

    => FenCodeGenere.cpp
    #include "FenCodeGenere.h"
    
    FenCodeGenere::FenCodeGenere(QString &code, QWidget *parent = 0) : QDialog(parent)
    {
        codeGenere = new QTextEdit();
        codeGenere->setPlainText(code);
        codeGenere->setReadOnly(true);
        codeGenere->setFont(QFont("Courier"));
        codeGenere->setLineWrapMode(QTextEdit::NoWrap);
    
        fermer = new QPushButton("Fermer");
    
        QVBoxLayout *layoutPrincipal = new QVBoxLayout;
        layoutPrincipal->addWidget(codeGenere);
        layoutPrincipal->addWidget(fermer);
    
        resize(350, 450);
        setLayout(layoutPrincipal);
    
        connect(fermer, SIGNAL(clicked()), this, SLOT(accept()));
    }
    


    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      2 janvier 2009 à 23:13:22

      Citation : psychopathe

      QRegExp reg();
      
      Pas de parenthèse lorsque l'on déclare un objet et qu'on ne passe rien au constructeur.
      • Partager sur Facebook
      • Partager sur Twitter
        3 janvier 2009 à 10:12:32

        Salut,

        Merci pour ton aide ;)
        Je viens de corriger ça, mais toujours des erreurs...

        Et je ne vois toujours pas où :(
        Pourtant j'ai tous fait comme dans l'exemple de la doc...

        Voici l'erreur :
        mingw32-make -f Makefile.Release
        mingw32-make[1]: Entering directory `C:/Documents and Settings/Aurelien/Bureau/Q
        t/ZeroClassGenerator'
        g++ -c -O2 -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT
        -DQT_DLL -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS
        _QMAIN -I"c:\Qt\4.4.3\include\QtCore" -I"c:\Qt\4.4.3\include\QtCore" -I"c:\Qt\4.
        4.3\include\QtGui" -I"c:\Qt\4.4.3\include\QtGui" -I"c:\Qt\4.4.3\include" -I"." -
        I"c:\Qt\4.4.3\include\ActiveQt" -I"release" -I"." -I"c:\Qt\4.4.3\mkspecs\win32-g
        ++" -o release\FenPrincipale.o FenPrincipale.cpp
        FenPrincipale.cpp: In member function `void FenPrincipale::genererCode()':
        FenPrincipale.cpp:103: error: no matching function for call to `QRegExpValidator
        ::validate(QLineEdit*&, int&)'
        c:/Qt/4.4.3/include/QtGui/../../src/gui/widgets/qvalidator.h:186: note: candidat
        es are: virtual QValidator::State QRegExpValidator::validate(QString&, int&) con
        st
        mingw32-make[1]: *** [release/FenPrincipale.o] Error 1
        mingw32-make[1]: Leaving directory `C:/Documents and Settings/Aurelien/Bureau/Qt
        /ZeroClassGenerator'
        mingw32-make: *** [release] Error 2



        Merci d'avance
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          3 janvier 2009 à 12:15:15

          nom est un QLineEdit* alors que la fonction validate() attend un QString , passe lui nom->text() .
          • Partager sur Facebook
          • Partager sur Twitter
            3 janvier 2009 à 20:48:59

            Salut,

            On avance on avance :)

            Mais toujours des erreurs...

            C:\Documents and Settings\Aurelien\Bureau\Qt\ZeroClassGenerator>make release
            mingw32-make -f Makefile.Release
            mingw32-make[1]: Entering directory `C:/Documents and Settings/Aurelien/Bureau/Q
            t/ZeroClassGenerator'
            g++ -c -O2 -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT
            -DQT_DLL -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS
            _QMAIN -I"c:\Qt\4.4.3\include\QtCore" -I"c:\Qt\4.4.3\include\QtCore" -I"c:\Qt\4.
            4.3\include\QtGui" -I"c:\Qt\4.4.3\include\QtGui" -I"c:\Qt\4.4.3\include" -I"." -
            I"c:\Qt\4.4.3\include\ActiveQt" -I"release" -I"." -I"c:\Qt\4.4.3\mkspecs\win32-g
            ++" -o release\FenPrincipale.o FenPrincipale.cpp
            FenPrincipale.cpp: In member function `void FenPrincipale::genererCode()':
            FenPrincipale.cpp:103: error: no matching function for call to `QRegExpValidator
            ::validate(QString, int&)'
            c:/Qt/4.4.3/include/QtGui/../../src/gui/widgets/qvalidator.h:186: note: candidat
            es are: virtual QValidator::State QRegExpValidator::validate(QString&, int&) con
            st
            mingw32-make[1]: *** [release/FenPrincipale.o] Error 1
            mingw32-make[1]: Leaving directory `C:/Documents and Settings/Aurelien/Bureau/Qt
            /ZeroClassGenerator'
            mingw32-make: *** [release] Error 2

            Bon si je les ai bien compris il faudrait que je passe un QString à QRegExpValidator alors que moi je lui passe QRegExp, pourtant la doc fait comme ça... J'ai du encore loupé un petit détail :p


            Merci
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              3 janvier 2009 à 21:13:19

              C'est marrant ça, le compilo râle qu'il ne connait pas QRegExpValidator::validate(QString, int&) mais te dit qu'il connait QRegExpValidator::validate(QString&, int&) .
              Je ne sais pas pourquoi.
              • Partager sur Facebook
              • Partager sur Twitter
                3 janvier 2009 à 21:40:44

                C'est vrai que c'est très bizarre...
                Je vais aller poster un post sur un forum Qt pour voir ;)

                Enfin si quelqu'un à la réponse ici qu'il n'hésite pas!


                Merci
                • Partager sur Facebook
                • Partager sur Twitter
                  3 janvier 2009 à 21:41:34

                  Bonsoir,
                  La nouvelle ligne 103 correspondrait à quoi ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    3 janvier 2009 à 21:43:38

                    Salut,

                    Mon but est de faire la condition suivante : Si la chaîne nom contient un espace alors le programme revoit un message d'erreur et s'arrete.

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      3 janvier 2009 à 21:47:26

                      Citation : psychopathe

                      Je vais aller poster un post sur un forum Qt pour voir ;)

                      Ça m'a plutôt l'air d'un problème de C++.

                      Citation : psychopathe

                      Salut,Si la chaîne nom contient un espace alors le programme revoit un message d'erreur et s'arrete.

                      Pour faire ça, les regexp c'est le tank pour tuer une mouche. 'suffit d'utiliser QString::contains() <edit>(je l'avais dit pourtant)</edit>
                      • Partager sur Facebook
                      • Partager sur Twitter
                        3 janvier 2009 à 22:09:07

                        :euh:
                        J'ai essayer de l'utiliser, mais je n'y suis pas arrivé car la chaire de caractère est de type QString alors que pour utiliser cette fonction il faudrait quelle soit de type QChar...


                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          3 janvier 2009 à 22:51:26

                          Citation : psychopathe

                          :euh:
                          J'ai essayer de l'utiliser, mais je n'y suis pas arrivé car la chaire de caractère est de type QString alors que pour utiliser cette fonction il faudrait quelle soit de type QChar...

                          Tu sais lire la doc ?

                          QString chaine = "test";
                          
                          if(chaine.contains('t'))
                          {
                              // le programme rentre ici
                          }
                          
                          if(chaine.contains('T'))
                          {
                              // le programme n'entre pas là, la casse n'est pas bonne
                          }
                          
                          if(chaine.contains('T', Qt::CaseInsensitive))
                          {
                              // le programme entre ici, la casse n'est pas bonne mais avec Qt::CaseInsensitive on indique à la fonction de s'en foutre
                          }
                          
                          if(chaine.contains('u'))
                          {
                              // le programme n'entre pas là, il n'y a pas de 'u' dans "test"
                          }
                          
                          ...
                          
                          • Partager sur Facebook
                          • Partager sur Twitter

                          [Qt] Erreur lors de l'utilisation de QRegExpValidator

                          × 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