[QT] J'arrive pas à connecter mon signal

J'arrive pas à connecter mon signal [QT] - C++ - Programmation

Marsh Posté le 11-05-2003 à 11:01:54    

Dans mon IHM, j'ai un ensemble de label affichant chacun l'état d'un thread. Voici la déclaration de mon thread :  
 
 

Code :
  1. #ifndef __QTHREADBOT_H__
  2. #define __QTHREADBOT_H__
  3. #include <qobject.h>
  4. #include <qthread.h>
  5. class QThreadBot : public QObject, public QThread {
  6.   Q_OBJECT
  7. public:
  8.   QThreadBot () : QObject (0, "aThread" ), QThread () {
  9.     qDebug ("Creating a thread\n" );
  10.   }
  11.  
  12.   /* redefines run method */
  13.   void run ();
  14. signals:
  15.   void stateChanged (const QString &str);
  16. };
  17. #endif // __QTHREADBOT_H__


 
(j'en entend déjà rire dans le fond).
Je crée en même temps dans une boucle mes labels et mes threads :  
 

Code :
  1. QThreadBot *aBot = new QThreadBot ();
  2.     QLabel *lab = new QLabel (centralWidget, "threadLabel" );
  3.     lab->setGeometry (10, (20*i+1), 200, 15);
  4.     lab->setText ("creating thread" );
  5.     myBotList.append (aBot);
  6.     QObject::connect (aBot, SIGNAL (stateChanged (QString)),
  7.      lab, SLOT (setText (QString)));
  8.     aBot->start ();


 
Mais à l'éxécution, la connection ne se fait pas, et j'ai un message d'erreur pour chaque création de thread :  
 
 

QObject::connect: No such signal QThreadBot::stateChanged(QString)
QObject::connect:  (sender name:   'aThread')
QObject::connect:  (receiver name: 'threadLabel')

 
 
Qu'es-ce que j'ai bien pu rater ?


Message édité par kadreg le 11-05-2003 à 11:06:51

---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 11-05-2003 à 11:01:54   

Reply

Marsh Posté le 11-05-2003 à 11:19:56    

J'ai trouvé, c'est les types dans le connect qui étaient incomplets


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 13-05-2003 à 13:40:18    

Hello,
 
j'ai un problème relativement similaire, j'ai pas d'erreur à la compilation mais par contre pdt l'exécution du programme rien ne se passe  :??:
 

Code :
  1. QLabel *nbVies = new QLabel("Lives: "+ QString::number(tronFrame->getLives()), this, "nbVies" );
  2. nbVies->setFont(QFont("Verdana", 8, QFont::Bold));
  3. connect(tronFrame, SIGNAL(lifeRemoved()), nbVies, SLOT(setText("Player killed." )));


 
Dans mon jeu quand le joueur perd une vie je fais "emit lifeRemoved()", ce qui devrait changer le texte affiché, or il ne change pas, qqn voit d'où ça peut venir ?

Reply

Marsh Posté le 13-05-2003 à 13:41:46    

[ zed ] a écrit :


Dans mon jeu quand le joueur perd une vie je fais "emit lifeRemoved()", ce qui devrait changer le texte affiché, or il ne change pas, qqn voit d'où ça peut venir ?


 
Dans le SLOT, on met un type de paramettre, pas la valeur en elle même.


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 13-05-2003 à 13:50:53    

ok, bon g changé mon connect:

Code :
  1. connect(tronFrame, SIGNAL(lifeRemoved(QString)), nbVies, SLOT(setText(QString)));


et le emit:

Code :
  1. emit lifeRemoved("Player killed" );


 
mais tjs rien ne se passe  :??:

Reply

Marsh Posté le 13-05-2003 à 14:56:59    

:cry:

Reply

Marsh Posté le 13-05-2003 à 18:02:29    

alors, personne n'a d'idées ?  :(

Reply

Marsh Posté le 13-05-2003 à 18:03:26    

Montre la déclaration de ton signal


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 13-05-2003 à 18:09:00    

voilà:

Code :
  1. #ifndef TRONFRAME_H
  2. #define TRONFRAME_H
  3. #include <qframe.h>
  4. #include <qpixmap.h>
  5. #include "snakeobject.h"
  6. class TronFrame : public QFrame
  7. {
  8.     Q_OBJECT
  9. private:
  10. Snake Serpent, Cpu;
  11. QTimer *motionTimer, *drawTimer;
  12. QPixmap snakeBody, cpuBody, brick;
  13. char *Grille;
  14. int gameStarted, level, lives;
  15. public:
  16.     TronFrame (QWidget *parent=0, const char *name=0 );
  17. // plein de fonctions ici...
  18. public slots:
  19. void startGame();
  20. void animate();
  21. void redraw();
  22. void endGame(int);
  23. signals:
  24. void lifeRemoved(QString S);
  25. void changeStart(QString S);
  26. protected:
  27. void paintEvent (QPaintEvent *);
  28. void keyPressEvent (QKeyEvent *);
  29. };
  30. #endif // TRONFRAME_H

Reply

Marsh Posté le 13-05-2003 à 18:21:17    

bon apparement ça vient pas du signal, j'ai testé de changer le connect comme ça :  

Code :
  1. connect(tronFrame, SIGNAL(lifeRemoved(QString)), qApp, SLOT(quit()));


et là ça marche, le programme quitte... donc apparement c le setText() qui fonctionne pas ou alors c la frame qui est pas rafraîchie mais ça me semble bizarre...  :??:

Reply

Marsh Posté le 13-05-2003 à 18:21:17   

Reply

Marsh Posté le 13-05-2003 à 18:25:37    

[ zed ] a écrit :

bon apparement ça vient pas du signal, j'ai testé de changer le connect comme ça :  

Code :
  1. connect(tronFrame, SIGNAL(lifeRemoved(QString)), qApp, SLOT(quit()));


et là ça marche, le programme quitte... donc apparement c le setText() qui fonctionne pas ou alors c la frame qui est pas rafraîchie mais ça me semble bizarre...  :??:


c'est possible que le le texte du label ne soit pas changé aussitot. Crée un autre slot dans lequel du fait le setText sur le label suivi d'un repaint dessus

Reply

Marsh Posté le 13-05-2003 à 18:43:08    

gloop> ça marche pas mieux mais je viens de tomber sur une autre erreur, voici la classe qui fait toutes les connections vues plus haut :
 

Code :
  1. #include <qapplication.h>
  2. #include <qpushbutton.h>
  3. #include <qfont.h>
  4. #include <qlayout.h>
  5. #include <qlabel.h>
  6. #include <qwidget.h>
  7. #include "snakewindow.h"
  8. #include "snakeobject.h"
  9. class nTron: public QWidget
  10. {
  11. // Q_OBJECT
  12. private:
  13. QLabel *nbVies;
  14. QGridLayout *grid;
  15. QPushButton *start, *quit;
  16. TronFrame *tronFrame;
  17. public:
  18.     nTron( QWidget *parent=0, const char *name=0 );
  19. public slots:
  20. void updateFrame(QString s)
  21. {
  22.  nbVies->setText(s);
  23.  repaint();
  24. }
  25. };


en fait je me dis que mes problèmes viennent du fait que "Q_OBJECT" est en commentaire, mais le pb c que si j'enlève les commentaires ça me donne ça à la compilation :
 

Linking...
main.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall nTron::initMetaObject(void)" (?initMetaObject@nTron@@MAEXXZ)
main.obj : error LNK2001: unresolved external symbol "public: virtual char const * __thiscall nTron::className(void)const " (?className@nTron@@UBEPBDXZ)
main.obj : error LNK2001: unresolved external symbol "public: static class QMetaObject * __cdecl nTron::staticMetaObject(void)" (?staticMetaObject@nTron@@SAPAVQMetaObject@@XZ)
Debug/Snake.exe : fatal error LNK1120: 3 unresolved externals
Error executing link.exe.


et là je pige encore moins  :??:

Reply

Marsh Posté le 13-05-2003 à 19:03:12    

la macro Q_OBJECT doit être présente dans chaque classe gérant des signaux et/ou slots.
les erreurs de link sont certainement dues au fait que le fichier créé par moc n'est pas mis

Reply

Marsh Posté le 13-05-2003 à 19:11:14    

gloop a écrit :

la macro Q_OBJECT doit être présente dans chaque classe gérant des signaux et/ou slots.


ui, enfin à la base y'a pas de signaux ni slots dans cette classe, g juste rajouté un slot pour pouvoir faire le repaint() mais bon je me heurte à un nouveau pb maintenant  ;)
 

Citation :

les erreurs de link sont certainement dues au fait que le fichier créé par moc n'est pas mis


n'est pas mis où ?
et on le met comment ?


Message édité par [ ZeD ] le 13-05-2003 à 19:11:39
Reply

Marsh Posté le 13-05-2003 à 19:51:43    

ben tu fais:
moc truc.h -o truc.moc.cpp
 
pour la suite, tu compiles le truc.moc.cpp normalement

Reply

Marsh Posté le 14-05-2003 à 16:50:37    

effectivement ça a l'air de marcher maintenant, merci bien!  :)

Reply

Marsh Posté le 14-05-2003 à 17:13:18    

un dernier truc kan même  :p
 
comment on fait pour dire à VC++ de faire un moc automatique de certains fichiers ?

Reply

Marsh Posté le 14-05-2003 à 17:17:00    

[ zed ] a écrit :


comment on fait pour dire à VC++ de faire un moc automatique de certains fichiers ?


 
Si tu utilise qt3, tu as qmake qui a partir de la liste de tes fichiers est capable de te générer un fichier .dsp gérant la compilation des fichiers, et l'utilisation de moc en cas de besoin


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 14-05-2003 à 17:36:22    

non j'utilise qt 2.30 mais c bon g trouvé en trifouillant dans les options du projet ;)
 
merci!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed