Qt 文本浏览器不实时显示
Posted
技术标签:
【中文标题】Qt 文本浏览器不实时显示【英文标题】:Qt text browser not displays in real time 【发布时间】:2014-08-09 08:52:20 【问题描述】:我写了一个函数来计算一些值,并使用append
在每次计算值时将它们写入textBrowser
。
我想要的是每次append
执行时,数据同时显示在textBrowser
中。
但是,当函数结束时,所有数据都会立即显示。不是一一的。
另外,我有一个按钮。我希望它在推送时更改其文本,并在其功能完成时再次更改。于是我写了:
void MainWindow::on_btn_clicked()
ui->btn->setText("Running...");
//some codes
ui->btn->setText("Reset");
但它只会在 clicked
函数结束时将按钮的文本更改为“重置”。
我认为这两个问题可能是相关的,但我找不到解决方案。
【问题讨论】:
【参考方案1】:在控件返回事件循环之前,GUI 不会更新。因此,当附加到文本浏览器时,一旦执行主事件循环,它们就会全部更新。这也适用于设置按钮的文本。当调用on_btn_clicked()
时,按钮的文本直到函数完成才会更新。
如果你有一些需要长时间处理的代码,那么你不应该把它放在主线程中。它应该在另一个线程中完成,该线程通过信号和槽与主线程交互,以便报告一些进度或更新 GUI 元素。
【讨论】:
【参考方案2】:您需要了解程序中发生了什么。
首先,看看Threading Basics。之后,您可以从Multithreading Technologies in Qt 中选择您想要的方法。
简而言之,您的问题是您在主线程中进行了一些阻塞的长期计算。为避免这种情况,您必须在单独的线程中提供所有计算。以下是您问题的充分答案:https://***.com/a/1386160/867349。
最简单但不好的方法是将QCoreApplication::processEvents()
例如放在//some codes
的循环中。希望您能找到更好的方法,例如 QtCuncurrentRun
或在上面的链接中准备工作线程。
【讨论】:
以上是关于Qt 文本浏览器不实时显示的主要内容,如果未能解决你的问题,请参考以下文章