我从服务器获得连续答案,延迟时间为1秒。我将此答案附加到QTextEdit字段。但是方法调用完成后首先显示更改。 如何立即显示更改? 我尝试过update(),但它确实有效。
void ClientWidget::setAnswer(ValueStream *resultStream){
std::vector<std::string> answer;
for(int i = 0; i < 15; i++){
value tmpResultValue;
if(resultStream->get(tmpResultValue)){
this->client.parseResult(tmpResultValue, answer);
std::vector<QString> qAnswer = vectorStringToVectorQstring(answer);
for (unsigned int n = 0; n < qAnswer.size(); n++){
this->answerTextEdit->append(qAnswer[n]);
}
this->answerTextEdit->update();
}
answer.clear();
}
resultStream->close();
delete resultStream;
}
在此之后 - > answerTextEdit-&gt;追加(qAnswer [n]);应该显示更改,但它们不会立即显示
答案 0 :(得分:1)
你可以打电话
QApplication::processEvents();
打电话给你的方法。
答案 1 :(得分:1)
当您设置TextEdit小部件的文本时,会发出一个已更改的信号,以便小部件更新您看到的内容。该信号被放置在消息队列中,这些消息在Qt事件循环中作为事件处理。
在处理传入数据时,Qt的事件循环无法继续,直到您完成。一个简单但不是最好的处理方法是调用QApplication :: processEvents以允许事件循环运行;当处理队列中的所有事件时,这可能是非常低效的。
处理耗时处理的更好方法是将其移动到新线程上,这对QThread来说相当容易。这样,您可以处理来自服务器的传入请求,并从您的线程向主线程发出信号,然后主线程可以更新TextEdit小部件。
要了解如何使用QThread,我建议您阅读this article。这真的不难做,我建议你尝试一下,而不是添加对QApplication :: processEvents的调用。
答案 2 :(得分:0)
如果您可以更改ValueStream
每次以value
作为参数提供新的value
时发出信号,那么它将变得更加容易。只需将一个插槽连接到它,您可以将答案附加到answerTextEdit