1

メッセージを受信したときに、チャット ウィンドウの内容を更新する必要があります。私が使用する2つの関数は次のとおりです。

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

1 に答える 1