Partage
  • Partager sur Facebook
  • Partager sur Twitter

Connecteur autre Fenetre Bug

Sujet résolu
    18 octobre 2008 à 11:10:06

    Bonjour,

    J'ai une fenetre principale qui affiche des informations. Quand je clique sur un bouton nouveau, ca m'ouvre une autre fenetre pour mettre mon formulaire.
    Sur cette fenetre de formulaire, j'ai 2 boutons, valider et annuler. Le problème étant que le bouton annuler marche bien, je l'ai relié à close le bouton :

    connect(b_annuler, SIGNAL(clicked()), this, SLOT(close()));
    


    Mais le problème c'est le bouton valider, je ne sais pas pourquoi quand je clique dessus ca fait rien, alor que mes autres boutons sur la fenetre principale marche, voilà le connecteur ue j'utilise :

    connect(b_valider, SIGNAL(clicked()), this, SLOT(ajouter()));
    


    Dans le fichier FenFormulaire.h qui est ma fenetre pour le formulaire. J'ai ajouté ceci :

    public slots:
       void ajouter();
    


    Puis, j'ai ajouté ceci dans mon fichier FenPrincipale.cpp ou il y aussi ma fenetre FenFormulaire dans le meme fichier.

    void FenFormilaire::ajouter()
    {
    QMessageBox::information(this, "Ajouter", "Ajouter ====> A remplir !");
    }

    Le problème, c'est que ca marche pas le bouton Valider alors que annuler marche et j'ai pas d'erreurs de compiation.

    Merci
    • Partager sur Facebook
    • Partager sur Twitter
      18 octobre 2008 à 12:10:56

      Je suppose que le bouton valider est censé ajouter quelque chose dans la fenetre principale, et non pas dans la fenetre secondaire. Dans ce cas, soit tu prends un pointeur sur la fenetre principale en la passant en parent et en stockant le pointeur dans une variable de classe, soit tu émets un signal lorsque le bouton valider est cliqué, ce signal étant relié a un slot de la fenetre principale qui va ajouter l'argument passé en paramètre de ton signal.
      • Partager sur Facebook
      • Partager sur Twitter
        18 octobre 2008 à 12:28:30

        Et bien non et oui en fait, je vais écrire dans un fichier les données du formulaire et après il va falloir que je recharge la QStringList.
        Donc pour écrire dans un fichier j'ai pas besoin de faire un lien sur la fenetre principale mais après pour recharger la QStringList, il faudra et je ne sais pas comment faire...

        Est ce que vous pourriez me donner un exemple pour ces 2 points (faire marche le bouton et recharger la QStringList sur la liste principale) svp ?

        Merci
        • Partager sur Facebook
        • Partager sur Twitter
          18 octobre 2008 à 15:09:30

          Le bouton valider ne fait-il vraiment rien? Peut-être enregistre-t-il effectivement les données dans un fichier. Pour ce qui est de recharger la QStringList, je pense qu'un simple signal émit peut convenir, en connectant ce signal avec un slot qui va recharger la QStringList depuis le fichier (si j'ai bien compris). Si cette solution ne convient pas, poste le code, s'il te plaît.
          • Partager sur Facebook
          • Partager sur Twitter
            18 octobre 2008 à 22:52:57

            Oui le bouton ne fait rien du tout. Voilà les sources

            FenPrincpale.h :

            #ifndef DEF_FENPRINCIPALE
            #define DEF_FENPRINCIPALE
            
            #include <QtGui>
            
            class FenPrincipale : public QMainWindow
            {
            Q_OBJECT
            
            	public:
            		FenPrincipale();
            
            	public slots:
            		void miseajour();
            		void options();
            		void apropos();
            		void jouer();
            		void modifier();
            		void supprimer();
            	
                private:
                    QListView *vue;
                    QStringListModel *modele;
                    QPushButton *b_jouer;
            		QPushButton *b_ajouter;
            		QPushButton *b_modifier;
            		QPushButton *b_supprimer;
            
            };
            
            
            #endif
            


            FenAjouter.h :

            #ifndef DEF_FENPRINCIPALE
            #define DEF_FENPRINCIPALE
            
            #include <QtGui>
            
            class FenPrincipale : public QMainWindow
            {
            Q_OBJECT
            
            	public:
            		FenPrincipale();
            
            	public slots:
            		void miseajour();
            		void options();
            		void apropos();
            		void jouer();
            		void modifier();
            		void supprimer();
            	
                private:
                    QListView *vue;
                    QStringListModel *modele;
                    QPushButton *b_jouer;
            		QPushButton *b_ajouter;
            		QPushButton *b_modifier;
            		QPushButton *b_supprimer;
            
            };
            
            
            #endif
            


            FenPrincipale.cpp :

            #include <QtGui>
            #include "FenPrincipale.h"
            #include "FenAjouter.h"
            
            FenPrincipale::FenPrincipale()
            {
                setFixedSize(250, 300);
                setWindowTitle("GuyWow v0.1 Beta");
            	
            	//Barre du Menu
            	QMenu *menuFichier = menuBar()->addMenu("&Fichier");
            			QAction *actionOptions = new QAction("&Options", this);
            			menuFichier->addAction(actionOptions);
            			connect(actionOptions, SIGNAL(triggered()), this, SLOT(options()));	
            	
            		    QAction *actionQuitter = new QAction("&Quitter", this);
            			actionQuitter->setShortcut(QKeySequence("Ctrl+Q"));
            			menuFichier->addAction(actionQuitter);
            			connect(actionQuitter, SIGNAL(triggered()), qApp, SLOT(quit()));
            
            	QMenu *menuInterrogration = menuBar()->addMenu("&?");
            			QAction *actionMiseajour = new QAction("&Mise à jour", this);
            			menuInterrogration->addAction(actionMiseajour);
            			connect(actionMiseajour, SIGNAL(triggered()), this, SLOT(miseajour()));
            			
            			QAction *actionApropos = new QAction("&A Propos", this);
            			menuInterrogration->addAction(actionApropos);
            			actionApropos->setShortcut(QKeySequence("F1"));
            			connect(actionApropos, SIGNAL(triggered()), this, SLOT(apropos()));
            			
            
            	//Zone Centrale
            	QWidget *zoneCentrale = new QWidget;
            	QGridLayout *layout = new QGridLayout;
            
                QStringList listeServeur;
                listeServeur << "Test1" << "Test2";
                modele = new QStringListModel(listeServeur);
                vue = new QListView ;
                vue->setModel(modele);
            	
            	b_ajouter = new QPushButton("Ajouter");
            	b_modifier = new QPushButton("Modifier");
            	b_supprimer = new QPushButton("Effacer");
                b_jouer = new QPushButton("Jouer");
            
            	layout->addWidget(vue, 0, 0, 1, 3);
                layout->addWidget(b_ajouter, 1, 0);
            	layout->addWidget(b_modifier, 1, 1);
            	layout->addWidget(b_supprimer, 1, 2);
                layout->addWidget(b_jouer, 2, 0, 1, 3);
            
                zoneCentrale->setLayout(layout);
            	setCentralWidget(zoneCentrale);
            
            	
            	//Connexions aux Slots
                connect(b_jouer, SIGNAL(clicked()), this, SLOT(jouer()));
            	QWidget::connect(b_ajouter, SIGNAL(clicked()), new FenAjouter(), SLOT(show()));
            	connect(b_modifier, SIGNAL(clicked()), this, SLOT(modifier()));
            	connect(b_supprimer, SIGNAL(clicked()), this, SLOT(supprimer()));
            	
            	//Barre de Statut
            	QStatusBar *barreEtat = statusBar();
                barreEtat->showMessage("Prêt");
            	actionQuitter->setStatusTip("Fermer le programme");
            	b_jouer->setStatusTip("a completer");
            	b_modifier->setStatusTip("a completer");
            	b_ajouter->setStatusTip("a completer");
            	b_supprimer->setStatusTip("a completer");
            	
            }
            
            FenAjouter::FenAjouter()
            {
                setFixedSize(250, 130);
            	setWindowTitle("Ajouter un Serveur");
            	
            	//Formulaire
            	QLabel *LabelServeur = new QLabel("Serveur :");
                QLineEdit *EditServeur = new QLineEdit;
                EditServeur->setFixedWidth(150);
                LabelServeur->setAlignment(Qt::AlignTop);
                QLabel *LabelAdresse = new QLabel("Adresse :");
                QLineEdit *EditAdresse = new QLineEdit;
                EditAdresse->setFixedWidth(150);
                LabelAdresse->setAlignment(Qt::AlignTop);
            	
            	//Boutons
            	b_valider = new QPushButton("Valider");
            	b_annuler = new QPushButton("Annuler");
            	
            	//Connexions aux slots
            	connect(b_valider, SIGNAL(clicked()), this, SLOT(ajouter()));
            	connect(b_annuler, SIGNAL(clicked()), this, SLOT(close()));	
            	
            	//Layout
            	QGroupBox *groupbox = new QGroupBox("Serveur");
            	
            	QGridLayout *layoutFormulaire = new QGridLayout;
                layoutFormulaire->addWidget(LabelServeur, 0, 0);
            	layoutFormulaire->addWidget(EditServeur, 0, 1);
            	
            	layoutFormulaire->addWidget(LabelAdresse, 1, 0);
            	layoutFormulaire->addWidget(EditAdresse, 1, 1);
            	
            
            	groupbox->setLayout(layoutFormulaire);
            	
            	QGridLayout *layout = new QGridLayout;
            	layout->setAlignment(Qt::AlignTop);
            	layout->addWidget(groupbox, 0, 0, 1, 2, Qt::AlignTop);
                layout->addWidget(b_annuler, 1, 0, Qt::AlignLeft);
                layout->addWidget(b_valider, 1, 1, Qt::AlignRight);
                setLayout(layout);
            	
            }
            
            void FenPrincipale::apropos()
            {
            QMessageBox::information(this, "A Propos", "Codé par <strong>Guyguy333</strong><br />Toute copie ou reproduction partielle est interdite<br />© Copyright  2008");
            }
            
            void FenPrincipale::miseajour()
            {
            QMessageBox::information(this, "Mise à jour", "Mise a jour====> A remplir !");
            }
            
            void FenPrincipale::jouer()
            {
                QItemSelectionModel *selection = vue->selectionModel();
                QModelIndex indexElementSelectionne = selection->currentIndex();
                QVariant elementSelectionne = modele->data(indexElementSelectionne, Qt::DisplayRole);
                QMessageBox::information(this, "Elément sélectionné", elementSelectionne.toString());
            }
            
            void FenPrincipale::modifier()
            {
            QMessageBox::information(this, "Modifier", "Modifier ====> A remplir !");
            }
            
            void FenPrincipale::supprimer()
            {
            QMessageBox::information(this, "Supprimer", "Supprimer ====> A remplir !");
            }
            
            void FenPrincipale::options()
            {
            QMessageBox::information(this, "Options", "Options ====> A remplir !");
            }
            
            void FenAjouter::ajouter()
            {
            QMessageBox::information(this, "Ajouter", "Ajouter ====> A remplir !");
            }
            


            • Partager sur Facebook
            • Partager sur Twitter
              22 octobre 2008 à 19:03:28

              void FenFormilaire::ajouter()
              {
              QMessageBox::information(this, "Ajouter", "Ajouter ====> A remplir !");
              }
              

              C'est FenFormulaire, pas FenFormilaire
              • Partager sur Facebook
              • Partager sur Twitter
                22 octobre 2008 à 19:16:17

                Tu peut donner le code de ton FenAjouter.h ( j'ai l'impression que ce que celui que tu as mis est celui de FenPrincipale.h ) ?
                • Partager sur Facebook
                • Partager sur Twitter
                  22 octobre 2008 à 20:52:25

                  Je ne vois pas pourquoi tu fais QWidget::connect, au lieu de connect tout seul (connect n'est pas redéfini dans QWidget). Ensuite, je te conseille de faire un slot personnalisé dans lequel tu crées une nouvelle fenêtre, parce que le coup de l'initialisation dans le connect, je trouve ça assez dangereux.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 octobre 2008 à 19:18:12

                    Bonjour,

                    Alors j'ai mis connect tout seul et ca n'a pas résolu le problème.
                    Oui j'ai fait une erreur en donnant FenAjouter.h, voilà son vrai contenu :

                    #ifndef DEF_FENETREAJOUTER
                    #define DEF_FENETREAJOUTER
                    
                    
                    class FenAjouter : public QWidget
                    {
                    
                        public:
                    		FenAjouter();
                    	
                    	public slots:
                    		void ajouter();
                    	
                    	private:
                    		QPushButton *b_valider;
                    		QPushButton *b_annuler;
                    
                    };
                    
                    #endif
                    


                    merci
                    • Partager sur Facebook
                    • Partager sur Twitter
                      23 octobre 2008 à 19:57:46

                      tu as oublié de mettre Q_OBJECT dans FenAjouter.h ( qu'il faut mettre au même endroit que à l'endroit où tu l'as mis pour FenPrincipale.h ) ce qui fait que le slot ajouter n'est pas déclaré comme un slot ;)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        23 octobre 2008 à 20:09:11

                        Citation : rom1504

                        tu as oublié de mettre Q_OBJECT dans FenAjouter.h ( qu'il faut mettre au même endroit que à l'endroit où tu l'as mis pour FenPrincipale.h ) ce qui fait que le slot ajouter n'est pas déclaré comme un slot ;)



                        Le problème c'est que quand je le rajoute ca ne compile plus...Voilà l'erreur qui est surement du au fait que ma fenetre principale est une QMainWindow je pense :

                        Image utilisateur
                        • Partager sur Facebook
                        • Partager sur Twitter
                          23 octobre 2008 à 20:33:13

                          on voit pas une partie de l'erreur dans ton screen, fait un copier coller plutôt ;)
                          • Partager sur Facebook
                          • Partager sur Twitter
                            23 octobre 2008 à 20:39:58

                            C:\Qt\Prog>make
                            mingw32-make -f Makefile.Release
                            mingw32-make[1]: Entering directory `C:/Qt/Prog'
                            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"..\4.4.3\include\QtCore" -I"..\4.4.3\include\QtCore" -I"..\4.4.3\inclu
                            de\QtGui" -I"..\4.4.3\include\QtGui" -I"..\4.4.3\include" -I"." -I"c:\Qt\4.4.3\i
                            nclude\ActiveQt" -I"release" -I"." -I"..\4.4.3\mkspecs\win32-g++" -o release\Fen
                            Principale.o FenPrincipale.cpp
                            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"..\4.4.3\include\QtCore" -I"..\4.4.3\include\QtCore" -I"..\4.4.3\inclu
                            de\QtGui" -I"..\4.4.3\include\QtGui" -I"..\4.4.3\include" -I"." -I"c:\Qt\4.4.3\i
                            nclude\ActiveQt" -I"release" -I"." -I"..\4.4.3\mkspecs\win32-g++" -o release\mai
                            n.o main.cpp
                            g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-rel
                            oc -Wl,-s -mthreads -Wl -Wl,-subsystem,windows -o release\Prog.exe release/Fen
                            Principale.o release/main.o release/moc_FenPrincipale.o release/qrc_ressources.o
                              -L"c:\Qt\4.4.3\lib" -lmingw32 -lqtmain release\icone_res.o -lQtGui4 -lQtCore4
                            release/FenPrincipale.o(.text+0x6d):FenPrincipale.cpp: undefined reference to `v
                            table for FenAjouter'
                            release/FenPrincipale.o(.text+0x74):FenPrincipale.cpp: undefined reference to `v
                            table for FenAjouter'
                            release/FenPrincipale.o(.text+0x92d):FenPrincipale.cpp: undefined reference to `
                            vtable for FenAjouter'
                            release/FenPrincipale.o(.text+0x934):FenPrincipale.cpp: undefined reference to `
                            vtable for FenAjouter'
                            collect2: ld returned 1 exit status
                            mingw32-make[1]: *** [release\Prog.exe] Error 1
                            mingw32-make[1]: Leaving directory `C:/Qt/Prog'
                            mingw32-make: *** [release] Error 2
                            • Partager sur Facebook
                            • Partager sur Twitter
                              23 octobre 2008 à 20:44:25

                              tu peut montrer comment est FenAjouter.h maintenant ?
                              • Partager sur Facebook
                              • Partager sur Twitter
                                23 octobre 2008 à 20:59:51

                                Citation : rom1504

                                tu peut montrer comment est FenAjouter.h maintenant ?



                                #ifndef DEF_FENETREAJOUTER
                                #define DEF_FENETREAJOUTER
                                
                                
                                class FenAjouter : public QWidget
                                {
                                Q_OBJECT
                                
                                
                                    public:
                                		FenAjouter();
                                	
                                	public slots:
                                		void ajouter();
                                	
                                	private:
                                		QPushButton *b_valider;
                                		QPushButton *b_annuler;
                                
                                };
                                
                                #endif
                                


                                Citation : Gigotdarnaud

                                Faut faire qmake avant.



                                J'ai fait un qmake puis un make et là plein d'erreur :o

                                C:\Qt\Prog>make
                                mingw32-make -f Makefile.Release
                                mingw32-make[1]: Entering directory `C:/Qt/Prog'
                                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"..\4.4.3\include\QtCore" -I"..\4.4.3\include\QtCore" -I"..\4.4.3\inclu
                                de\QtGui" -I"..\4.4.3\include\QtGui" -I"..\4.4.3\include" -I"." -I"c:\Qt\4.4.3\i
                                nclude\ActiveQt" -I"release" -I"." -I"..\4.4.3\mkspecs\win32-g++" -o release\moc
                                _FenAjouter.o release\moc_FenAjouter.cpp
                                In file included from release\moc_FenAjouter.cpp:10:
                                release\/../FenAjouter.h:6: error: expected class-name before '{' token
                                release\/../FenAjouter.h:10: error: ISO C++ forbids declaration of `Q_OBJECT' wi
                                th no type
                                release\/../FenAjouter.h:10: error: expected `;' before "public"
                                release\/../FenAjouter.h:13: error: expected `:' before "slots"
                                release\/../FenAjouter.h:14: error: expected primary-expression before "void"
                                release\/../FenAjouter.h:14: error: ISO C++ forbids declaration of `slots' with
                                no type
                                release\/../FenAjouter.h:14: error: expected `;' before "void"
                                release\/../FenAjouter.h:17: error: ISO C++ forbids declaration of `QPushButton'
                                 with no type
                                release\/../FenAjouter.h:17: error: expected `;' before '*' token
                                release\/../FenAjouter.h:18: error: ISO C++ forbids declaration of `QPushButton'
                                 with no type
                                release\/../FenAjouter.h:18: error: expected `;' before '*' token
                                release\moc_FenAjouter.cpp:12:2: #error "The header file 'FenAjouter.h' doesn't
                                include <QObject>."
                                release\moc_FenAjouter.cpp:20: error: expected constructor, destructor, or type
                                conversion before "static"
                                release\moc_FenAjouter.cpp:20: error: expected `,' or `;' before "static"
                                release\moc_FenAjouter.cpp:40: error: `QMetaObject' does not name a type
                                release\moc_FenAjouter.cpp:45: error: expected init-declarator before '*' token
                                release\moc_FenAjouter.cpp:45: error: expected `,' or `;' before '*' token
                                release\moc_FenAjouter.cpp:51: error: no `void* FenAjouter::qt_metacast(const ch
                                ar*)' member function declared in class `FenAjouter'
                                release\moc_FenAjouter.cpp: In member function `void* FenAjouter::qt_metacast(co
                                nst char*)':
                                release\moc_FenAjouter.cpp:53: error: `strcmp' undeclared (first use this functi
                                on)
                                release\moc_FenAjouter.cpp:53: error: (Each undeclared identifier is reported on
                                ly once for each function it appears in.)
                                release\moc_FenAjouter.cpp:55: error: `QWidget' has not been declared
                                release\moc_FenAjouter.cpp:55: error: `qt_metacast' undeclared (first use this f
                                unction)
                                release\moc_FenAjouter.cpp: At global scope:
                                release\moc_FenAjouter.cpp:58: error: `QMetaObject' has not been declared
                                release\moc_FenAjouter.cpp:58: error: `int FenAjouter::qt_metacall' is not a sta
                                tic member of `class FenAjouter'
                                release\moc_FenAjouter.cpp:58: error: `Call' was not declared in this scope
                                release\moc_FenAjouter.cpp:58: error: expected primary-expression before "int"
                                release\moc_FenAjouter.cpp:58: error: expected primary-expression before "void"
                                release\moc_FenAjouter.cpp:59: error: initializer expression list treated as com
                                pound expression
                                release\moc_FenAjouter.cpp:59: error: expected `,' or `;' before '{' token
                                release\moc_FenAjouter.cpp:71: error: expected constructor, destructor, or type
                                conversion at end of input
                                release\moc_FenAjouter.cpp:71: error: expected `,' or `;' at end of input
                                mingw32-make[1]: *** [release/moc_FenAjouter.o] Error 1
                                mingw32-make[1]: Leaving directory `C:/Qt/Prog'
                                mingw32-make: *** [release] Error 2
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Anonyme
                                  23 octobre 2008 à 21:15:04

                                  T'a oublier d'inclure QWidget, QPushButton (dans FenAjouter.h) et QMetaObject (dans FenAjouter.cpp).
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    23 octobre 2008 à 21:18:31

                                    Merci beaucoup à vous tous, le bouton marche !!!! :D:D:D

                                    Merci encore vous etes super !
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Connecteur autre Fenetre Bug

                                    × 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