1

我编写了一个函数来计算一些值,并在每次计算值append时将它们写入。textBrowser

我想要的是每次append执行时,数据都会textBrowser同时显示。

但是,当函数结束时,所有数据都会立即显示。不一一。

另外,我有一个按钮。我希望它在推送时更改其文本,并在其功能完成时再次更改。所以我写道:

void MainWindow::on_btn_clicked(){
    ui->btn->setText("Running...");
    //some codes
    ui->btn->setText("Reset");
}

clicked但它只会在功能结束时将按钮的文本更改为“重置” 。

我认为这两个问题可能是相关的,但我找不到解决方案。

4

2 回答 2

3

在控件返回事件循环之前,GUI 不会更新。因此,当附加到文本浏览器时,一旦执行主事件循环,它们就会全部更新。这也适用于设置按钮的文本。调用时on_btn_clicked(),按钮的文本在函数完成之前不会更新。

如果你有一些代码需要长时间处理,那么你不应该把它放在主线程中。它应该在另一个线程中完成,该线程通过信号和槽与主线程交互,以报告一些进度或更新 GUI 元素。

于 2014-08-09T09:49:48.183 回答
2

您需要了解程序中发生了什么。

首先,看一下Threading Basics。之后,您可以从Qt 中的多线程技术中选择您想要的方法。

简而言之,您的问题是您在主线程中进行了一些阻塞的长期计算。为避免这种情况,您必须在单独的线程中提供所有计算。这是您问题的充分答案:https ://stackoverflow.com/a/1386160/867349 。

最简单但不是很好的方法是将QCoreApplication::processEvents()例如放在你//some codes的循环中。希望您能QtCuncurrentRun在上面的链接中找到更好的方法,例如或准备工作线程

于 2014-08-09T09:56:53.287 回答