2013-12-16 4 views
2

I는 2 종류있다 : I 슬롯이 ChessLanTEst 클래스Qt는 신호 슬롯 문제

void RecieveMessage(QString); 

: 서버 클래스

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); 
}; 

를 I 신호를

void ShowMessage(QString); 

0과 나는 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 매크로를 사용해야합니다. Like :

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

이러한 매크로의 정의를 검색하면 인수가 실제로 문자열로 변환된다는 것을 알 수 있습니다.

+0

질문에 새로운 Qt5 오버로드가 사용 된 것 같습니다. 그래서 이것은 문제가되어서는 안된다. 하지만 시도해 볼만한 가치가 있습니다. 디버그 빌드로 런타임 오류 메시지가 표시 될 수 있습니다. – hyde

+0

qt5를 사용하고 있습니다. 버전이 작동하지 않습니다. – ExiD

+0

ShowMessage 함수를 슬롯으로 올바르게 선언 했습니까? 전체 클래스 정의를 게시하면 정확하게 – Pat