2017-01-30 4 views
2

Je tryng pour relier() d'un signal en fil 2 à fente dans un fil conducteur, j'ai constructeur du genre, qui se déroule en fil 2 en tant que catégorie enfant de QThread:fentes et les signaux dans QThread

InputHandler::InputHandler() 
{ 
    connect(this, SIGNAL(write(User*, Message)), TTCServer::ttcserver, SLOT(write(User*, Message))); 
    qDebug() << "new thread created!"; 
} 

mais je reçois une erreur d'exécution

QObject::connect: No such signal QThread::write(User*, Message) 

Mon inputhandler.h ressemble à ça:

#ifndef INPUTHANDLER_H 
#define INPUTHANDLER_H 

#include <QThread> 
#include <QDebug> 
#include <QString> 
#include "message.h" 
#include "data.h" 

class InputHandler : public QThread 
{ 
public: 
    InputHandler(); 
    void run(); 

private: 
    Message message; 
    void login(User* user, QString login); 
    void sendLogins(User* user); 
    void startGameWith(User* user, QString opponentLogin); 

signals: 
    void write(User* user, Message message); 
}; 

#endif // INPUTHANDLER_H 

Et si cela importe, je suis als o inncluding ttcserver.h:

#ifndef TTCSERVER_H 
#define TTCSERVER_H 

#include <QTcpServer> 
#include <QObject> 
#include <QDebug> 
#include "data.h" 
#include "user.h" 
#include "message.h" 
#include "inputhandler.h" 

class TTCServer : public QTcpServer 
{ 
    Q_OBJECT 

public: 
    explicit TTCServer(); 
    static TTCServer* ttcserver; 
    void run(); 

signals: 

public slots: 
    void newConnection(); 
    void write(User* user, Message message); 

private: 
    QTcpServer* server; 
    Message* message; 
    void handleInputFrom(User* user); 

}; 

#endif 

// TTCSERVER_H 

void write méthode est DÉFINIES dans ttcserver.cpp comme ça:

void TTCServer::write(User* user, Message message) 
{ 
    qDebug() << "Signal recieved!"; 
} 

Alors pourquoi write(User*, Message) dans une fonction connect() essaie d'être QThread::write() au lieu de InputHandler::write()?

User et Message sont des classes, pour être clair.

+3

Si vous utilisez Qt5, ils ont un nouveau format pour 'connect()' qui utilise des adresses réelles au lieu des macros SIGNAL et SLOT. Peut-être que cela serait plus prévisible pour vous. http://doc.qt.io/qt-5/signalsandslots.html – infixed

+0

J'utilise Qt5.8, je n'ai pas eu besoin de changer le code, parce que le nouveau Qt est rétrocompatible, mais de toute façon, c'est une fonctionnalité sympa montré ici. – Ginko

+0

http://stackoverflow.com/questions/26422154/my-signal-slot-connection-does-not-work/26422155#26422155 – Silicomancer

Répondre

3

Vous avez oublié d'ajouter la Q_OBJECT macro dans InputHandler:

class InputHandler : public QThread 
{ 
    Q_OBJECT 
public: 
    InputHandler(); 
    void run(); 
<...> 

Depuis la macro est manquant, moc ne crée pas le code correspondant pour les signaux/slots pour travailler dans cette classe, donc il essaie de se connecter à QObject, car il a la macro, et est la classe de base.

+1

Voilà, merci! J'avais 'référence indéfinie à vtable' mais' Build-> Run qmake' a fait l'affaire. – Ginko

+0

@Ginko, oui, cela arrive parce que vous devez toujours exécuter qmake après avoir ajouté/supprimé ces macros, car c'est qmake qui exécute l'utilitaire moc sur ces fichiers – SingerOfTheFall