2017-01-30 49 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 

,如果此事確實,我阿爾斯Øinncluding ttcserver.h:

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

那麼,爲什麼write(User*, Message)connect()函數試圖成爲QThread::write(),而不是InputHandler::write()

#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這樣definied?

UserMessage是類,要清楚。

+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(); 
<...> 

由於宏丟失,建設部將不會產生相應的代碼信號/插槽於該類工作,因此它會嘗試連接到QObject,因爲它確實有宏,並且是基類。

+1

就是這樣,謝謝! 我有'未定義引用vtable',但'建設 - >運行qmake'做了伎倆。 – Ginko

+0

@Ginko,是的,這是因爲你總是需要在添加/刪除這些宏之後運行qmake,因爲它是在這些文件上運行moc實用程序的qmake – SingerOfTheFall