Qt立即显示变化

时间:2013-11-06 14:35:43

标签: qt qtextedit

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

3 个答案:

答案 0 :(得分:1)

你可以打电话

QApplication::processEvents();

打电话给你的方法。

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

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