Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Qt] Problème avec connect()

Sujet résolu
Anonyme
    22 octobre 2006 à 16:59:47

    Bonjour à tous, je découvre depuis peu Qt, et c'est vraiment très intéréssant, malgré qu'il n'y ait pas de tutos, et qu'il faille lire la doc (mais ça ne me dérange pas le moins du monde ^^ )

    Mais j'ai un petit problème avec la fonction connect(). Le code suivant est censé vider la zone de texte lorsqu'on clique sur nouveau, mais ça ne fait rien :( (j'ai essayé par toutes les manières que j'ai pu, mais je n'arrive à rien )

    #include <QApplication>
    #include <QVBoxLayout>
    #include <QWidget>
    #include <QTextEdit>
    #include <QMenu>
    #include <QMenuBar>
    #include <QLabel>

    class MyWidget : public QWidget
    {
        private :
            QTextEdit *textEdit;
            QMenu *fichier;
            QAction *quitter;
            QAction *nouveau;
        public:
            MyWidget(QWidget *parent = 0);
            void nouveauFichier();
    };
    void MyWidget::nouveauFichier()
    {
        textEdit->setText("");
    }

    MyWidget::MyWidget(QWidget *parent)
        : QWidget(parent)
    {
        textEdit = new QTextEdit();
        fichier = new QMenu(tr("&Fichier"));

        quitter = new QAction(tr("&Quitter"), this);
        quitter->setStatusTip(tr("Quitte le programme"));
        quitter->setShortcut(tr("ESC"));
        connect(quitter, SIGNAL(triggered()), qApp, SLOT(quit()));

        nouveau = new QAction(tr("&Nouveau"), this);
        nouveau->setStatusTip(tr("Crée un nouveau fichier vide"));
        nouveau->setShortcut(tr("CTRL+N"));
        connect(nouveau, SIGNAL(triggered()), this, SLOT(nouveauFichier()));

        fichier->addAction(nouveau);
        fichier->addAction("&Ouvrir ...");
        fichier->addAction("&Enregistrer");
        fichier->addAction("&Enregistrer sous ...");
        fichier->addSeparator();
        fichier->addAction(quitter);

        QMenuBar *menu = new QMenuBar();
        menu->addMenu(fichier);

        QVBoxLayout *layout = new QVBoxLayout;
        layout->addWidget(menu);
        layout->addWidget(textEdit);
        setLayout(layout);
    }
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
        MyWidget widget;
        widget.show();
        return app.exec();
    }


    Voilà, merci à vous si vous pouvez m'aider
    • Partager sur Facebook
    • Partager sur Twitter
      22 octobre 2006 à 17:03:10

      il te manque la macro :
      Q_OBJECT
      au début de ta classe et la fonction nouveauFichier() n'est pas déclarée en tant que SLOT

      voilà :
      class MyWidget : public QWidget
      {
      Q_OBJECT
          private :
              QTextEdit *textEdit;
              QMenu *fichier;
              QAction *quitter;
              QAction *nouveau;
          public:
              MyWidget(QWidget *parent = 0);
          public slots:
              void nouveauFichier();
      };
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        22 octobre 2006 à 17:10:30

        Merci :)

        Argh, le programme ne se lance pas :

        Citation


        Linking executable: C:\Documents and Settings\HP_Propriétaire\Mes documents\Programmation\C-C++\Qt\Test\Test.exe
        .objs\main.o:main.cpp:(.text+0x240): undefined reference to `vtable for MyWidget'
        .objs\main.o:main.cpp:(.text+0x24c): undefined reference to `vtable for MyWidget'
        .objs\main.o:main.cpp:(.text+0xd76): undefined reference to `vtable for MyWidget'
        .objs\main.o:main.cpp:(.text+0xd82): undefined reference to `vtable for MyWidget'
        .objs\main.o:main.cpp:(.text$_ZN8MyWidget2trEPKcS1_[MyWidget::tr(char const*, char const*)]+0x1c): undefined reference to `MyWidget::staticMetaObject'
        .objs\main.o:main.cpp:(.text$_ZN8MyWidgetD1Ev[MyWidget::~MyWidget()]+0xb): undefined reference to `vtable for MyWidget'
        .objs\main.o:main.cpp:(.text$_ZN8MyWidgetD1Ev[MyWidget::~MyWidget()]+0x17): undefined reference to `vtable for MyWidget'
        collect2: ld returned 1 exit status
        Process terminated with status 1 (0 minutes, 2 seconds)



        (j'avais déjà eu des erreurs du genre en suivant les tutos fournis avec la doc, à partir du premier tutos ou ils utilisent plusieurs fichiers (mais je n'en utilise qu'un seul ...) (je pense que c'est le tutos n°7)
        • Partager sur Facebook
        • Partager sur Twitter
          22 octobre 2006 à 17:11:43

          tu compiles avec quoi ? console ou IDE ?
          faut rajouter moc_***.cpp et faut recompiler (cf : mon tuto # compilation)
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            22 octobre 2006 à 17:25:22

            Si je met moc_main.cpp, ça m'affiche ça :

            Citation

            Execution of 'moc_main.cpp' in 'C:\Documents and Settings\HP_Propriétaire\Mes documents\Programmation\C-C++\Qt\Test' failed.



            Et si je suis ce qui est dit dans ton tuto (qt-moc-ui main.cpp), il me remet ça :

            Citation


            Linking executable: C:\Documents and Settings\HP_Propriétaire\Mes documents\Programmation\C-C++\Qt\Test\Test.exe
            .objs\main.o:main.cpp:(.text+0x240): undefined reference to `vtable for MyWidget'
            .objs\main.o:main.cpp:(.text+0x24c): undefined reference to `vtable for MyWidget'
            .objs\main.o:main.cpp:(.text+0xd76): undefined reference to `vtable for MyWidget'
            .objs\main.o:main.cpp:(.text+0xd82): undefined reference to `vtable for MyWidget'
            .objs\main.o:main.cpp:(.text$_ZN8MyWidget2trEPKcS1_[MyWidget::tr(char const*, char const*)]+0x1c): undefined reference to `MyWidget::staticMetaObject'
            .objs\main.o:main.cpp:(.text$_ZN8MyWidgetD1Ev[MyWidget::~MyWidget()]+0xb): undefined reference to `vtable for MyWidget'
            .objs\main.o:main.cpp:(.text$_ZN8MyWidgetD1Ev[MyWidget::~MyWidget()]+0x17): undefined reference to `vtable for MyWidget'
            collect2: ld returned 1 exit status
            Process terminated with status 1 (0 minutes, 2 seconds)


            • Partager sur Facebook
            • Partager sur Twitter
              22 octobre 2006 à 17:31:45

              c'est pour celà qu'il faut séparer en plusieurs fichier :
              un fichier *.h contenant la déclaration de ta classe
              un fichier *.cpp contenant l'implémentation de ta classe
              un autre fichier *.cpp contenant la fnoction main
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                22 octobre 2006 à 17:42:48

                Ca ne marche toujours pas :(

                Voilà mes fichiers :

                main.cpp
                #include <QApplication>

                #include "MyWidget.h"
                int main(int argc, char *argv[])
                {
                    QApplication app(argc, argv);
                    MyWidget widget;
                    widget.show();
                    return app.exec();
                }


                MyWidget.h
                #ifndef MYWIDGET_HPP
                #define MYWIDGET_HPP
                #include <QWidget>
                #include <QTextEdit>

                class MyWidget : public QWidget
                {
                Q_OBJECT
                    private :
                        QTextEdit *textEdit;
                        QMenu *fichier;
                        QAction *quitter;
                        QAction *nouveau;
                    public:
                        MyWidget(QWidget *parent = 0);
                    public slots:
                        void nouveauFichier();
                };

                #endif


                MyWidget.cpp
                #include "MyWidget.h"
                #include <QApplication>
                #include <QMenu>
                #include <QMenuBar>
                #include <QVBoxLayout>
                void MyWidget::nouveauFichier()
                {
                    textEdit->setText("");
                }

                MyWidget::MyWidget(QWidget *parent)
                    : QWidget(parent)
                {
                    textEdit = new QTextEdit();
                    fichier = new QMenu(tr("&Fichier"));

                    quitter = new QAction(tr("&Quitter"), this);
                    quitter->setStatusTip(tr("Quitte le programme"));
                    quitter->setShortcut(tr("ESC"));
                    connect(quitter, SIGNAL(triggered()), qApp, SLOT(quit()));

                    nouveau = new QAction(tr("&Nouveau"), this);
                    nouveau->setStatusTip(tr("Crée un nouveau fichier vide"));
                    nouveau->setShortcut(tr("CTRL+N"));
                    connect(nouveau, SIGNAL(triggered()), this, SLOT(nouveauFichier()));

                    fichier->addAction(nouveau);
                    fichier->addAction("&Ouvrir ...");
                    fichier->addAction("&Enregistrer");
                    fichier->addAction("&Enregistrer sous ...");
                    fichier->addSeparator();
                    fichier->addAction(quitter);

                    QMenuBar *menu = new QMenuBar();
                    menu->addMenu(fichier);

                    QVBoxLayout *layout = new QVBoxLayout;
                    layout->addWidget(menu);
                    layout->addWidget(textEdit);
                    setLayout(layout);
                }


                J'ai bien mis "qt-moc-ui MyWidget.h" et coché "Always execute ...", et mis le fichier qt-moc-ui dans le dossier C:/Qt/4.2.0/bin

                PS : J'utilise Code::Blocks
                • Partager sur Facebook
                • Partager sur Twitter
                  22 octobre 2006 à 17:48:16

                  je viens de compiler en ligne de commande et çà marche parfaitement.
                  as tu rajouté le fichier moc_MyWidget.cpp à ton projet ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    22 octobre 2006 à 17:56:39

                    En ajoutant moc_MyWidget.cpp au projet, ce qui fait que j'ai donc ceci dans Build Option->Commands->Pre-Build Steps :

                    Citation

                    qt-moc-ui MyWidget.h
                    moc_MyWidget.cpp


                    Et il m'affiche ceci comme erreur :

                    Citation

                    Execution of 'moc_MyWidget.cpp' in 'C:\Documents and Settings\HP_Propriétaire\Mes documents\Programmation\C-C++\Qt\Test' failed.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 octobre 2006 à 18:00:21

                      tu n'as pas compris, vire çà tout de suite, quand on dit "rajouter au projet" c'est faire clic droit sur ton projet > "add file"
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        22 octobre 2006 à 18:02:44

                        Ah, la boulette -_-"

                        Merci beaucoup :)
                        • Partager sur Facebook
                        • Partager sur Twitter

                        [Qt] Problème avec 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