0

我从服务器获得连续的答案,延迟时间为 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->append(qAnswer[n]); 应显示更改,但不会立即显示

4

3 回答 3

1

当您设置 TextEdit 小部件的文本时,会发出一个已更改的信号,以便小部件更新您看到的内容。该信号被放置在一个消息队列中,这些消息在 Qt 事件循环中作为事件处理。

当您处理传入的数据时,Qt 的事件循环在您完成之前无法继续。一个简单但不是最好的处理方法是调用 QApplication::processEvents 来允许事件循环运行;这可能非常低效,因为队列中的所有事件都已处理。

处理耗时处理的更好方法是将其移动到新线程上,这对于 QThread 来说相当容易。这样,您可以处理来自服务器的传入请求,并从您的线程向主线程发出信号,然后主线程可以更新 TextEdit 小部件。

要了解如何使用 QThread,我建议阅读这篇文章。这真的不难做到,我建议您尝试一下,而不是添加对 QApplication::processEvents 的调用。

于 2013-11-06T15:01:04.577 回答
1

你可以打电话

QApplication::processEvents();

在调用你的方法之后。

于 2013-11-06T14:50:51.927 回答
0

如果您可以更改ValueStream为在每次有新value的可用时发出一个信号value作为参数,那么它会变得容易得多。只需将一个插槽连接到它,您将答案附加到answerTextEdit

于 2013-11-06T15:19:14.333 回答