IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

QObject::connect ne fonctionne pas

  1. #1
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 764
    Points
    764
    Par défaut QObject::connect ne fonctionne pas
    Bonjour,

    J'ai le code suivant, dans le constructeur de l'une de mes classes (simplifié):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    QPushButton entrer = new QPushButton;
    QComboBox langues = new QComboBox;
    QObject::connect(entrer, SIGNAL(clicked()), this, SLOT(addToInputStack()));
     
    QObject::connect(langues, SIGNAL(currentIndexChanged(int)), this, SLOT(changeLang(int)));
    Et à l'exécution, j'ai ces erreurs:
    Object::connect: No such slot QObject::addToInputStack() in console.cpp:18
    Object::connect: No such slot QObject::changeLang(int) in console.cpp:24
    Or, ceci est dans une classe dérivée de QObject, implémentant les deux fonctions.

    Pourquoi la méthode connect va-t-elle chercher les fonctions dans QObject et pas dans ma classe? (nommée Console)

    Merci d'avance,
    ProgVal

    EDIT: et d'après le débogueur, à la ligne où est présent connect, this pointe bien vers un objet de type Console

  2. #2
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Déjà, pas la peine de préfixer par QObject:: si tu te trouves dans une classe qui en hérite (si elle hérite de QWidget, elle hérite forcément de QObject).

    Ensuite, tu as bien passé ton fichier .h à la moulinette du moc ?

  3. #3
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 764
    Points
    764
    Par défaut
    Citation Envoyé par Alp Voir le message
    Déjà, pas la peine de préfixer par QObject:: si tu te trouves dans une classe qui en hérite (si elle hérite de QWidget, elle hérite forcément de QObject).
    Ok. Ma classe hérite directement de QObject.

    Citation Envoyé par Alp Voir le message
    Ensuite, tu as bien passé ton fichier .h à la moulinette du moc ?
    C'est à dire? (Google n'est pas très explicite)

  4. #4
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 659
    Points : 188 664
    Points
    188 664
    Par défaut
    Citation Envoyé par ProgVal Voir le message
    C'est à dire? (Google n'est pas très explicite)
    Le moc est un outil qui permet de faire accepter à ton compilateur C++ les nouveautés de Qt : les signaux, les slots...

    Si tu utilises qmake pour la compilation, alors tu utilises forcément le moc. Sinon, passe à qmake !

  5. #5
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860

  6. #6
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 764
    Points
    764
    Par défaut
    J'utilise le compilateur de Qt Creator (ça devrait être le qmake, normalement ^^)
    J'ai vérifié en lançant qmake à partir de la console => aucun changement

    EDIT: j'avais mis mes slots en temps que public; je les ai mis en public slots, mais aucun changement.

  7. #7
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Citation Envoyé par ProgVal Voir le message
    J'utilise le compilateur de Qt Creator (ça devrait être le qmake, normalement ^^)
    J'ai vérifié en lançant qmake à partir de la console => aucun changement

    EDIT: j'avais mis mes slots en temps que public; je les ai mis en public slots, mais aucun changement.
    Est-ce que tu as bien :
    au tout début de la déclaration de ta classe ?

    EDIT : lire ceci pourrait t'aider.

  8. #8
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 764
    Points
    764
    Par défaut
    J'ai oublié de précisé que je l'avais ajouté en même temps que public slot, donc oui, il y est bien.

  9. #9
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Bon. Tu peux nous c/c ton .h avec donc la déclaration de ta classe ? Ainsi que les commandes que tu exécutes pour compiler.

  10. #10
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 764
    Points
    764
    Par défaut
    Déclaration de la classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #ifndef CONSOLE_H
     #define CONSOLE_H
      class Console : QObject
     {
         Q_OBJECT
         public:
             Console(QApplication*, QStringList, QStringList);
             int push(QString);
             QString getInputStack();
         public slots:
             int changeLang(int);
             QString addToInputStack();
         private:
             QWidget fenetre;
             QGridLayout *layout;
             QPlainTextEdit *sorties;
             QLineEdit *entree;
             QPushButton *entrer;
              QString inputStack;
             QComboBox *langues;
             QStringList idLangues;
             QTranslator translator;
             QApplication* app;
     };
      #endif // CONSOLE_H
    Et pour les commandes... Ctrl + R (équivalent au bouton "run")

  11. #11
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Rajoute public devant QObject, juste après "class Console :".

    Il se peut que ça joue.

  12. #12
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 764
    Points
    764
    Par défaut
    Comme ça?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #ifndef CONSOLE_H
    #define CONSOLE_H
     
    class Console : QObject
    {
        public:
            Q_OBJECT
            Console(QApplication*, QStringList, QStringList);
            int push(QString);
            QString getInputStack();
        public slots:
            int changeLang(int);
            QString addToInputStack();
        private:
            QWidget fenetre;
            QGridLayout *layout;
            QPlainTextEdit *sorties;
            QLineEdit *entree;
            QPushButton *entrer;
     
            QString inputStack;
            QComboBox *langues;
            QStringList idLangues;
            QTranslator translator;
            QApplication* app;
    };
     
    #endif // CONSOLE_H
    Aucun changement

  13. #13
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Non non.
    Tranformer ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class Console : QObject
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class Console : public QObject

  14. #14
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 764
    Points
    764
    Par défaut
    Aucun changement.

  15. #15
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Tant qu'on y est, mets aussi le .cpp (et laisse le public devant QObject).

    Ca doit être le connect qui déraille

  16. #16
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 764
    Points
    764
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #include <QtGui>
     #include "console.h"
     Console::Console(QApplication *application, QStringList shortIdLanguesDisponibles, QStringList nomLanguesDisponibles) : QObject(), app(application)
     {
         // ...
        entrer = new QPushButton;
         entrer->setText(tr("Send", "Send the typed text to the input stack"));
         entrer->setToolTip(tr("Send the typed text to the input stack", "ToolTip of the 'Send' button"));
          // ...
        QObject::connect(entrer, SIGNAL(clicked()), this, SLOT(addToInputStack()));
          langues = new QComboBox;
         langues->addItems(nomLanguesDisponibles);
         // ...
         QObject::connect(langues, SIGNAL(currentIndexChanged(int)), this, SLOT(changeLang(int)));
          // ...
    }

  17. #17
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Et en mettant à la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QObject::connect(/* etc */)
    ?

    Et si ça ne marche toujours pas, fais un "Clean All" puis "Build All" ou alors "Rebuild All".

  18. #18
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 764
    Points
    764
    Par défaut
    p, li { white-space: pre-wrap; } debug/moc_console.cpp:12:2: erreur: #error "The header file 'console.h' doesn't include <QObject>."
    In file included from debug/moc_console.cpp:10:
    debug/../console.h:5: erreur: expected class-name before ‘{’ token
    debug/../console.h:6: erreur: ISO C++ forbids declaration of ‘Q_OBJECT’ with no type
    debug/../console.h:7: erreur: expected ‘;’ before ‘public’
    debug/../console.h:9: erreur: ‘QString’ has not been declared
    debug/../console.h:10: erreur: ‘QString’ does not name a type
    debug/../console.h:11: erreur: expected `:' before ‘slots’
    debug/../console.h:12: erreur: expected primary-expression before ‘int’
    debug/../console.h:12: erreur: ISO C++ forbids declaration of ‘slots’ with no type
    debug/../console.h:12: erreur: expected ‘;’ before ‘int’
    debug/../console.h:13: erreur: ‘QString’ does not name a type
    debug/../console.h:15: erreur: ‘QWidget’ does not name a type
    debug/../console.h:16: erreur: ISO C++ forbids declaration of ‘QGridLayout’ with no type
    debug/../console.h:16: erreur: expected ‘;’ before ‘*’ token
    debug/../console.h:17: erreur: ISO C++ forbids declaration of ‘QPlainTextEdit’ with no type
    debug/../console.h:17: erreur: expected ‘;’ before ‘*’ token
    debug/../console.h:18: erreur: ISO C++ forbids declaration of ‘QLineEdit’ with no type
    debug/../console.h:18: erreur: expected ‘;’ before ‘*’ token
    debug/../console.h:19: erreur: ISO C++ forbids declaration of ‘QPushButton’ with no type
    debug/../console.h:19: erreur: expected ‘;’ before ‘*’ token
    debug/../console.h:21: erreur: ‘QString’ does not name a type
    debug/../console.h:22: erreur: ISO C++ forbids declaration of ‘QComboBox’ with no type
    debug/../console.h:22: erreur: expected ‘;’ before ‘*’ token
    debug/../console.h:23: erreur: ‘QStringList’ does not name a type
    debug/../console.h:24: erreur: ‘QTranslator’ does not name a type
    debug/../console.h:25: erreur: ISO C++ forbids declaration of ‘QApplication’ with no type
    debug/../console.h:25: erreur: expected ‘;’ before ‘*’ token
    debug/moc_console.cpp:20: erreur: expected constructor, destructor, or type conversion before ‘static’
    debug/moc_console.cpp:43: erreur: ‘QMetaObject’ does not name a type
    debug/moc_console.cpp:48: erreur: expected initializer before ‘*’ token
    debug/moc_console.cpp:53: erreur: no ‘void* Console::qt_metacast(const char*)’ member function declared in class ‘Console’
    debug/moc_console.cpp:61: erreur: ‘int Console::qt_metacall’ is not a static member of ‘class Console’
    debug/moc_console.cpp:61: erreur: ‘QMetaObject’ has not been declared
    debug/moc_console.cpp:61: erreur: expected primary-expression before ‘int’
    debug/moc_console.cpp:61: erreur: expected primary-expression before ‘void’
    debug/moc_console.cpp:61: erreur: initializer liste d'expressions traitée comme une expression composée
    debug/moc_console.cpp:62: erreur: expected ‘,’ or ‘;’ before ‘{’ token
    make[1]: *** [debug/moc_console.o] Erreur 1

  19. #19
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Et si tu inclues QObject dans console.h ?

  20. #20
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 764
    Points
    764
    Par défaut
    Si je l'inclue, j'ai ça:
    In file included from debug/moc_console.cpp:10:
    debug/../console.h:9: erreur: expected `)' before ‘*’ token
    debug/../console.h:16: erreur: field ‘fenetre’ has incomplete type
    debug/../console.h:17: erreur: ISO C++ forbids declaration of ‘QGridLayout’ with no type
    debug/../console.h:17: erreur: expected ‘;’ before ‘*’ token
    debug/../console.h:18: erreur: ISO C++ forbids declaration of ‘QPlainTextEdit’ with no type
    debug/../console.h:18: erreur: expected ‘;’ before ‘*’ token
    debug/../console.h:19: erreur: ISO C++ forbids declaration of ‘QLineEdit’ with no type
    debug/../console.h:19: erreur: expected ‘;’ before ‘*’ token
    debug/../console.h:20: erreur: ISO C++ forbids declaration of ‘QPushButton’ with no type
    debug/../console.h:20: erreur: expected ‘;’ before ‘*’ token
    debug/../console.h:23: erreur: ISO C++ forbids declaration of ‘QComboBox’ with no type
    debug/../console.h:23: erreur: expected ‘;’ before ‘*’ token
    debug/../console.h:24: erreur: field ‘idLangues’ has incomplete type
    debug/../console.h:25: erreur: ‘QTranslator’ does not name a type
    debug/../console.h:26: erreur: ISO C++ forbids declaration of ‘QApplication’ with no type
    debug/../console.h:26: erreur: expected ‘;’ before ‘*’ token
    EDIT: la ligne 9 de console.h est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Console(QApplication*, QStringList, QStringList);

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 0
    Dernier message: 27/02/2013, 15h03
  2. Connection String ne fonctionne pas !
    Par NTIC13 dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 22/02/2011, 12h20
  3. RPC over HTTP (connection ne fonctionne pas)
    Par E n x dans le forum Exchange Server
    Réponses: 0
    Dernier message: 29/11/2008, 17h11
  4. Auto-connect ne fonctionne pas
    Par guyguy333 dans le forum Débuter
    Réponses: 17
    Dernier message: 06/09/2008, 21h41
  5. [BasicDataSource] Connection.close() ne fonctionne pas?
    Par Jidefix dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 27/02/2008, 20h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo