2013-03-07 56 views
1

我需要在收到消息時更新聊天窗口的內容。以下是我使用的兩個功能:Qt QTcpSocket在讀取數據時不發送信號

void LinPop::_createChat(Client *socket) 
{ 
    ChatDialog *chat = new ChatDialog(); 

    chat->setAttribute(Qt::WA_DeleteOnClose); 
    qDebug() << "Connecting chat : "; 
    qDebug() << connect(chat, SIGNAL(toSend(QString&)), socket, SLOT(send(QString&))); 
    qDebug() << connect(socket, SIGNAL(gotTexted(QString)), chat, SLOT(updateChat(QString))); 
    chat->exec(); 
} 

這是插槽有東西要讀取時調用的插槽。它工作正常,除了沒有發出信號或連接的插槽未被調用。

void Client::readyRead() 
{ 
    if (this->_socket->bytesAvailable() > 0) 
    { 
     QByteArray data = this->_socket->readAll(); 
     QString text(data); 

     emit gotTexted(text); 
     qDebug() << "ReadyRead [" << text << "] [" << this->_socket->bytesAvailable() << "]"; 
    } 
} 

控制檯輸出:

Connecting chat : 
true 
true 
Sent [ "Test" ] 
ReadyRead [ "Test" ] [ 0 ] 

現在,如果我這樣做,它進入一個無限循環,但突然的信號/插槽事情的作品就好了,我的文本被髮送到聊天窗口,顯示:

void Client::readyRead() 
{ 
    if (this->_socket->bytesAvailable() > 0) 
    { 
     QByteArray data = this->_socket->readAll(); 
     QString text(data); 
     this->_socket->write(data); // Added this 

     emit gotTexted(text); 
     qDebug() << "ReadyRead [" << text << "] [" << this->_socket->bytesAvailable() << "]"; 
    } 
} 

控制檯輸出:

Connecting chat : 
true 
true 
Sent [ "Test" ] 
ReadyRead [ "Test" ] [ 0 ] 
Update Chat [ "Test" ] 
ReadyRead [ "Test" ] [ 0 ] 
// Infinite Loop 

我不明白爲什麼它不擺在首位,或者爲什麼,當我把它變成一個無限循環,它突然開始工作工作...

PS:這裏是updateChat插槽:

void ChatDialog::updateChat(QString text) 
{ 
    this->ui->tbConv->insertPlainText(text); 
    qDebug() << "Update Chat [" << text << "]"; 
} 
+0

你期待從QtcpSocket哪些信號? – spiritwolfform 2013-03-07 09:23:21

+0

你能提供一個簡短的,可編輯的例子嗎? – bruno 2013-03-07 10:20:20

回答

0

如何執行套接字連接?我不能讓代碼負責監聽連接。如果你沒有任何其他的TCP客戶端嘗試使用telnet