2013-03-07 42 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