2017-01-30 16 views
2

Я tryng для подключения() сигнал в потоке 2 к слоту в главном потоке, у меня есть конструктор, как та, которая работает в потоке 2 в качестве дочернего класса от QThread:слоты и сигналы в QThread

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

, но я получаю сообщение об ошибке во время выполнения

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

Мой inputhandler.h выглядит следующим образом:

#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 

И если это имеет значение, я ALS о 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 метод определяемом в ttcserver.cpp вроде этого:

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

write(User*, Message) Так почему в connect() функции пытается быть QThread::write() вместо InputHandler::write()?

User и Message - классы, чтобы быть четкими.

+3

Если вы используете Qt5, у них есть новый формат для 'connect()', который использует фактические адреса вместо макросов SIGNAL и SLOT. Возможно, это будет более предсказуемо для вас. http://doc.qt.io/qt-5/signalsandslots.html – infixed

+0

Я использую Qt5.8, мне не нужно было менять код, потому что новый Qt обратный совместим, но в любом случае это приятная функция, которую вы показал здесь. – Ginko

+0

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

ответ

3

Вы забыли добавить Q_OBJECT макрос в InputHandler:

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

Поскольку макрос отсутствует, MOC не создаст соответствующий код для сигналов/слотов для работы в этом классе, таким образом, он пытается подключиться к QObject, так как он имеет макрос и является базовым классом.

+1

Это все, спасибо! У меня была 'неопределенная ссылка на vtable', но' Build-> Run qmake' сделал трюк. – Ginko

+0

@Ginko, да, это происходит потому, что вам всегда нужно запускать qmake после добавления/удаления этих макросов, так как qmake запускает утилиту moc для этих файлов – SingerOfTheFall