2013-12-16 84 views
2

我有2類:Qt的信號和槽麻煩

class Server : public QTcpServer 
{ 
Q_OBJECT 

public: 
Server(QObject * parent = 0 , quint16 port = 1922); 
void SendData(QString data); 
virtual ~Server(); 
signals: 
void RecieveMessage(QString); 

private slots: 
void acceptConnection(); 
void startRead(); 
void disconnected(); 

private: 
QTcpServer *tcpServer; 
QTcpSocket *client; 
}; 
在服務器類

class ChessLanTEst : public QMainWindow 
{ 
Q_OBJECT 

public: 
friend class Server; 
friend class Client; 
ChessLanTEst(QWidget *parent = 0); 
~ChessLanTEst(); 

private: 
Ui::ChessLanTEstClass ui; 
Server *server_; 
Client *client_; 
private slots: 
void createGame(); 
void ShowMessage(QString); 
}; 

我有信號:

void RecieveMessage(QString); 
在ChessLanTEst類

我有槽:

void ShowMessage(QString); 

,我連它在ChessLanTEst構造:

connect(server_, &Server::RecieveMessage, this, &ChessLanTEst::ShowMessage); 

,但我沒有收到這個信號,我不知道爲什麼。

+0

您是否在運行時收到消息? –

+0

檢查'connect'的返回值。確保(用斷點或調試打印)確實發出信號。 – hyde

+0

並確保'server_'是有效的指針,初始化而不是'nullptr'。另外,你確定你正在使用Qt5嗎? – hyde

回答

3

根據意見,你在server_構造發出,你做connect之前(因爲構造函數返回如果你有server_指針有效值)。

發射自己不會排隊,連接必須在發送之前完成,以便調用該插槽(或呼叫排隊)。

+0

!我不認爲這種情況 – ExiD

2

您需要使用SIGNAL和SLOT宏。像:

connect(server_, SIGNAL(RecieveMessage(QString)), this, SLOT(ShowMessage(QString))); 

如果您搜索這些宏的定義,您會發現參數實際上轉換爲字符串。

+0

這個問題好像是用新的QT5超載'connect',所以這不應該是一個問題。但值得嘗試,可能會得到運行時錯誤消息與調試版本。 – hyde

+0

我正在使用qt5。 您的版本無法正常工作 – ExiD

+0

您是否正確地將ShowMessage函數聲明爲插槽:?發佈完整的類定義可以幫助完全找到問題 – Pat