Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1177 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [QT] J'arrive pas à connecter mon signal

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[QT] J'arrive pas à connecter mon signal

n°389577
kadreg
profil: Utilisateur
Posté le 11-05-2003 à 11:01:54  profilanswer
 

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 !
mood
Publicité
Posté le 11-05-2003 à 11:01:54  profilanswer
 

n°389587
kadreg
profil: Utilisateur
Posté le 11-05-2003 à 11:19:56  profilanswer
 

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 !
n°391864
[ ZeD ]
Désigné volontaire
Posté le 13-05-2003 à 13:40:18  profilanswer
 

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 ?

n°391866
kadreg
profil: Utilisateur
Posté le 13-05-2003 à 13:41:46  profilanswer
 

[ 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 !
n°391872
[ ZeD ]
Désigné volontaire
Posté le 13-05-2003 à 13:50:53  profilanswer
 

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  :??:

n°392032
[ ZeD ]
Désigné volontaire
Posté le 13-05-2003 à 14:56:59  profilanswer
 

:cry:

n°392459
[ ZeD ]
Désigné volontaire
Posté le 13-05-2003 à 18:02:29  profilanswer
 

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

n°392463
kadreg
profil: Utilisateur
Posté le 13-05-2003 à 18:03:26  profilanswer
 

Montre la déclaration de ton signal


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
n°392473
[ ZeD ]
Désigné volontaire
Posté le 13-05-2003 à 18:09:00  profilanswer
 

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

n°392494
[ ZeD ]
Désigné volontaire
Posté le 13-05-2003 à 18:21:17  profilanswer
 

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...  :??:

mood
Publicité
Posté le 13-05-2003 à 18:21:17  profilanswer
 

n°392502
gloop
Posté le 13-05-2003 à 18:25:37  profilanswer
 

[ 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

n°392522
[ ZeD ]
Désigné volontaire
Posté le 13-05-2003 à 18:43:08  profilanswer
 

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  :??:

n°392532
gloop
Posté le 13-05-2003 à 19:03:12  profilanswer
 

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

n°392536
[ ZeD ]
Désigné volontaire
Posté le 13-05-2003 à 19:11:14  profilanswer
 

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
n°392577
gloop
Posté le 13-05-2003 à 19:51:43  profilanswer
 

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

n°393918
[ ZeD ]
Désigné volontaire
Posté le 14-05-2003 à 16:50:37  profilanswer
 

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

n°393994
[ ZeD ]
Désigné volontaire
Posté le 14-05-2003 à 17:13:18  profilanswer
 

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

n°394000
kadreg
profil: Utilisateur
Posté le 14-05-2003 à 17:17:00  profilanswer
 

[ 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 !
n°394038
[ ZeD ]
Désigné volontaire
Posté le 14-05-2003 à 17:36:22  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [QT] J'arrive pas à connecter mon signal

 

Sujets relatifs
[PERL] se connecter a une base Oracle avec DBIPossible de se connecter a une base free mysql avec java/Mysqfront ??
[PHP-MYSQL] J'ai un problème que je n'arrive pas à résoudre SVPJe n'arrive pas a faire un order by avec plusieur solition [resolu]
Algo de Dijkstra en C : j'y arrive pas !!!!Se connecter à une base ACCESS ?
j arrive pas a parser mon xml comme je veux[MySql] J'ai une idée, mais j'arrive pas à la mettre en oeuvre ! Help
se connecter a une base mysql avec delphi et easyphp[PHP] j'arrive pas a faire une simple requette mysql ??
Plus de sujets relatifs à : [QT] J'arrive pas à connecter mon signal


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR