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

Qt Discussion :

Erreur signaaux et slots entre 2 classes


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2005
    Messages : 60
    Par défaut Erreur signaaux et slots entre 2 classes
    Bonjour à tous!

    J'expérimente Qt depuis 2 semaines et j'ai un problème.
    J'ai abordé le tutoriel de trolltech sur les signals et les slots.
    Voici ma situation, j'écris un petit chat.

    À la connexion avec le serveur, le client lance un thread pour gérer la réception de messages.

    Comme il semble impossible de toucher au gui dans mon thread, je tente de créer 2 signals et 2 slots qui y sont ratachées.

    Des détails:
    - Le nom de la classe qui contient ma fonction de thread est qtsock.cpp
    - La slot appelé se trouve dans le qtclient2007Widget.cpp

    Le code associé:

    qtsock.h:
    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
    class qtsock : public QObject
    {
    	Q_OBJECT
    	public:
        		qtsock();
        		~qtsock();
    		int CreateSock(const char * ip);
    		bool sendsock(char * msg);
    		static void * TalkThread( void * SocketConnexion);
     
    	signals:
    		void NewMessage();
    		void NewClient();
     
    	private:
    		/* Variables globales */
    		int DestSock;
    		struct sockaddr_in destSockAddr;
    		bool endsock();
    };
    Dans le thread, j'ai simplement;
    Le qtclient2007Widget.cpp:
    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
    void qtclient2007Widget::btnConnect_clicked()
    {
    	/* Variables */
    	//qtsock cQtSock;
    	QString Nick;
    	QString Ip;
    	int SocketConnexion;
    	int result;
     
    	/* Identifiant du thread */
    	pthread_t thread_id;
     
    	connect(&cQtSock, SIGNAL( NewMessage() ), &qtclient2007Widget, SLOT( AddMsgToTextbox() ));
    	connect(&cQtSock, SIGNAL( NewMessage() ), &qtclient2007Widget, SLOT( AddNicknameToList() ));
    ...	
    }
    void qtclient2007Widget::AddMsgToTextbox()
    {}
    void qtclient2007Widget::AddNicknameToList()
    {}
    Le qtclient2007Widget.h:
    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
    class qtclient2007Widget : public qtclient2007WidgetBase
    {
        Q_OBJECT
     
    public:
        qtclient2007Widget(QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
        ~qtclient2007Widget();
     
        /* Variables */
        qtsock cQtSock;
     
    public slots:
        /*$PUBLIC_SLOTS$*/
    	virtual void btnEnvoie_clicked();
    	virtual void btnConnect_clicked();
    	virtual void AddMsgToTextbox();
    	virtual void AddNicknameToList();
     
    protected:
        /*$PROTECTED_FUNCTIONS$*/
    protected slots:
        /*$PROTECTED_SLOTS$*/
    };
    À la compilation j'obtiens cette erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    /home/shaika-dzari/QT/qtclient2007/src/qtclient2007widget.cpp: In member function ‘virtual void qtclient2007Widget::btnConnect_clicked()’:
    /home/shaika-dzari/QT/qtclient2007/src/qtclient2007widget.cpp:54: error: expected primary-expression before ‘,’ token
    /home/shaika-dzari/QT/qtclient2007/src/qtclient2007widget.cpp:55: error: expected primary-expression before ‘,’ token
    gmake[2]: *** [qtclient2007widget.o] Erreur 1
    gmake[2]: quittant le répertoire « /home/shaika-dzari/QT/qtclient2007/debug/src »
    gmake[1]: *** [all-recursive] Erreur 1
    gmake[1]: quittant le répertoire « /home/shaika-dzari/QT/qtclient2007/debug »
    gmake: *** [all] Erreur 2
    *** Sortie avec l'état : 2 ***

    À noter j'effectue le connect lorsque mon bouton connexion est pressé.
    Dois-je effectué le connect ailleurs?

    N'hésiter pas à me signaler les erreurs ou à donner vos remarques.


  2. #2
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Salut,

    Tu passes "&qtclient2007Widget" au connect. Or, qtclient2007Widget est le nom de ta classe, donc c'est pas valide

    Au chapitre des remarques, en vrac:
    > Il est préférable (je dis pas obligatoire) de préfixer les noms des classes par une majuscule, et les noms de variables par une minuscule. Ca te permettra une distinction immédiate plus tard.
    > Qt posséde des classes réseaux asynchrones qui te permettent de te passer complétement de threads dans la majorité des cas.

  3. #3
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2005
    Messages : 60
    Par défaut
    Citation Envoyé par IrmatDen
    Salut,
    Tu passes "&qtclient2007Widget" au connect. Or, qtclient2007Widget est le nom de ta classe, donc c'est pas valide
    Merci de ta réponse.
    J'ai essayé sans le & et j'ai la même erreur.

    Dois-je faire les connect(...) à un endroit précis ou c'est à ma convenance?


    Citation Envoyé par IrmatDen
    Au chapitre des remarques, en vrac:
    > Il est préférable (je dis pas obligatoire) de préfixer les noms des classes par une majuscule, et les noms de variables par une minuscule. Ca te permettra une distinction immédiate plus tard.
    > Qt posséde des classes réseaux asynchrones qui te permettent de te passer complétement de threads dans la majorité des cas.
    Il est vrai qu'il faut que j'harmonise les nom de mes variables et de ma classe...

    Pour le classes réseaux de Qt, c'est ma première application avec des sockets et c'est un laboratoire scolaire. Il nous ont montré le code de base avec la lib socket. C'est pourquoi j'utilise un thread et les méthodes "standards".

    @+

  4. #4
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Citation Envoyé par Shaika-Dzari
    J'ai essayé sans le & et j'ai la même erreur.
    C'est pas sans le & qu'il faut essayer. connect attend des instances de classes dérivant de QObject, pas des classes dérivant de QObject.
    Relis la doc sur les signaux/slots pour bien comprendre

  5. #5
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2005
    Messages : 60
    Par défaut
    Ok!
    Là je comprend mieux.

    Il faut donc que je lui donne le nom choisi lorsque j'instancie qtclient2007Widget. Je vais devoir modifier quelque trucs car lorsque qtclient2007Widget est instanciée, ma classe qtsock, elle, ne l'est pas encore...

    Je dois modifier ma conception
    Je laisse le sujet ouvert. Je vais tenter les modifications et revenir avec résolu ou avec une ou deux autre questions

    Merci de ton aide IrmatDen.

    @+

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

Discussions similaires

  1. Signaux-slots et USB entre deux classes
    Par SIGMA-Mike dans le forum Débuter
    Réponses: 0
    Dernier message: 19/01/2014, 15h50
  2. Réponses: 13
    Dernier message: 07/05/2013, 20h34
  3. [QtCore] Signal et slot entre classes
    Par tbar403 dans le forum PyQt
    Réponses: 2
    Dernier message: 01/03/2011, 12h45
  4. Réponses: 5
    Dernier message: 17/08/2005, 12h40
  5. Pb accès entre 2 classes static
    Par d.w.d dans le forum C++
    Réponses: 5
    Dernier message: 23/02/2005, 19h05

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