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: Вот обновление чата:

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

1

Решение

Как вы выполняете сокетное соединение? Я не могу получить код, ответственный за прослушивание соединения. Если у вас нет другого tcp клиента, попробуйте использовать telnet

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]