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 :

SIGNAL et SLOT (gros debutant)

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 4
    Par défaut SIGNAL et SLOT (gros debutant)
    bonjour,

    voila,, ca doit etre tout bete, mais je ne comprends pas trop le probleme :
    j'utilise un QListWidget, dans lequel, je mets 4 lignes toutes simple, et je veux (pour tester et comprendre, faire un connect entre le signal ItemClicked et un slot a moi pour changer le la couleur de fond de l'item, mais le connect ne marche pas, et je vois pas le souci :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #include <QApplication>
    #include <QListWidget>
    #include <QListWidgetItem>
    #include <QObject>
     
    class List : public QListWidget
    {
      Q_OBJECT
      public :
        List(QWidget *parent = 0);
      private slots :
        void ClickItem(QListWidgetItem * item);
    };
     
    void List::ClickItem(QListWidgetItem * item)
    {
      item->setBackground(QBrush(QColor(45,78,193)));
    }
     
    List::List(QWidget *parent)
    {
      connect(this, SIGNAL(itemClicked(QListWidgetItem *)), this, SLOT(ClickItem(QListWidgetItem *)));
    }
     
    int main (int argc, char * argv[])
    {
     QApplication app(argc, argv );
     
     List * ListWidget = new List();
     ListWidget->addItem(QString("option1"));
     ListWidget->addItem(QString("option2"));
     ListWidget->addItem(QString("option3"));
     ListWidget->addItem(QString("option4"));
     
     ListWidget->show();
     return app.exec();
    }
    si j compile, LD me donne le message suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    main.o: In function `List::List(QWidget*)':
    main.cpp:(.text+0x21): undefined reference to `vtable for List'
    main.cpp:(.text+0x28): undefined reference to `vtable for List'
    main.o: In function `List::List(QWidget*)':
    main.cpp:(.text+0x91): undefined reference to `vtable for List'
    main.cpp:(.text+0x98): undefined reference to `vtable for List'
    collect2: ld a retourné 1 code d'état d'exécution
    make: *** [listwidget] Erreur 1
    si j'essaie en supprimant Q_OBJECT de la classe, je n'ai pas d'erreur de linkage, mais a l'execution, j'ai le message suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object::connect: No such slot QListWidget::ClickItem(QListWidgetItem*)
    l'application fonctionne, elle s'affiche, mais au clic, rien, pasd'evenement.

    etant nouveau dans QT, je vois pas le probleme, c'est peu être tout bete.

    si quelqu'un a une idée ....
    là, j'en perds mon latin, ou plutot mon QT ...

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Salut et bienvenue sur le forum.
    le problème viens de ta façon de compiler.

    Quand tu utilise Q_OBJECT, il faut moccer le fichier . Ceci créera du code pour toi qu'il faut compiler et ajouter au link.

    Le plus simple est d'utiliser qmake.

    Si tu cherche dans le forum et dans les tutoriels, tu devrais trouver ton bonheur

    @+

  3. #3
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 4
    Par défaut
    Merci Mongaulois pour ta reponse rapide,

    par contre un compleement, je viens de voir que moc travaille sur les headers.

    si ma declaration de classe est mise dans mon .CPP,capose probleme ?
    je sais, mon code n'est pas propre, j'utilise pas de .h pour l'instant, c'est juste un test mais est-ce que ca peut poser des probleme ?

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par mesobius Voir le message
    Merci Mongaulois pour ta reponse rapide,

    par contre un compleement, je viens de voir que moc travaille sur les headers.

    si ma declaration de classe est mise dans mon .CPP,capose probleme ?
    je sais, mon code n'est pas propre, j'utilise pas de .h pour l'instant, c'est juste un test mais est-ce que ca peut poser des probleme ?
    Si tu peut.
    dans une prochaine mise à jour de la FAQ :

    comment avoir des class utilisant Q_OBJECT sans .h
    En C++, il peut être parfois interessant de déclarer une class directement dans un fichier d'implementation (.cpp,.cxx,.cc ...).
    Seulement certain class exploité par Qt doivent être moccé.
    Pour remédier à ce problème, il est tout à fait possible d'appliquer moc sur ce fichier. En contre partie, il faut inclure le fichier généré à la suite de la déclaration de la class dans le .cpp.
    Si vous utilisez qmake, il suffit, juste après la déclaration de la class, d'inclure un fichier utilisant le nom du fichier cpp suivi de l'extension .moc.
    Cette méthode est utilisé dans certain code de la Q/R pour simplifié la compilation de l'exemple à un seule fichier

    exemple dans un fichier nommé test.cpp
    Code :

    ...
    class myTest : QObject
    {
    Q_OBJECT
    ...
    };
    #include "test.moc"
    ...
    Sinon un peu de doc :
    http://qt.developpez.com/doc/4.4/moc...s-for-invoking

  5. #5
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 4
    Par défaut
    OK, merci beaucoup, ca fonctionne maintenant.

    en fait, il faut bien faire des .h pour mocé dessus, j'avais zappé complement la chose !!!

    on est un noob ou on l'est pas !!

    ca fait bien un fond bleu caca, mais au moins ca marche nickel

    Encore grand merci a toi, MonGaulois !!!!! (rapide, simple, clair, mais efficace)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probleme de code Qt: signal and Slot
    Par vivh349 dans le forum Qt
    Réponses: 10
    Dernier message: 08/07/2009, 12h17
  2. [gros debutant] utilsation du richTextBox.tEXT
    Par warubi dans le forum VB.NET
    Réponses: 1
    Dernier message: 05/05/2007, 14h25
  3. connect Signal et slot perso
    Par freecircus dans le forum Qt
    Réponses: 3
    Dernier message: 13/12/2006, 20h25
  4. [GROS debutant] Pourqoi ca marche paaas ?
    Par orichimaru dans le forum OpenGL
    Réponses: 2
    Dernier message: 28/11/2004, 15h56

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