c++ - Qt QTcpSocket 读取数据时不发出信号

标签 c++ qt sockets signals slot

我需要在收到消息时更新聊天窗口的内容。这是我使用的两个函数:

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 << "]";
}

最佳答案

如何进行套接字连接?我无法获得负责监听连接的代码。如果您没有任何其他 tcp 客户端,请尝试使用 telnet

关于c++ - Qt QTcpSocket 读取数据时不发出信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15263240/

相关文章:

c++ - 异步控制台输出

C++ 类型 'double' 和 'const char [5]' 到二进制 'operator+' 的无效操作数

c++ - 我可以将 Visual Studio 2015 C++ Redistributable DLL 与我的应用程序捆绑在一起吗?

c++ - 是否合理使用返回匿名结构的函数?

qt - Qt GUI和OpenCV2.2镜像之间的干扰问题

c++ - 如何在基于 Qt 的项目中设置应用程序图标?

c++ - Qt Q_PROPERTY 是否要求我的类继承 QObject?

c++ - recv 传入 0 以检测套接字错误是否安全?

Lisp 中的套接字

c - 套接字 : no data on recv()