如何实现QProgressBar进行繁重的计算?

时间:2016-03-29 08:22:51

标签: c++ qt qt-creator qprogressbar

我正在开发QT中的GUI,它根据用户输入执行一些繁重的计算。我在函数中执行所有计算,如 start_computation(),因为start_computation()函数被称为我的GUI挂起,因为它忙于执行start_computation()函数。所以,我想使用QProgressBar让用户知道GUI在后台执行某项任务。
在这种情况下,实现QProgressBar的最佳方法是什么?

3 个答案:

答案 0 :(得分:8)

如果整个复杂计算由一个函数处理,可以很容易地将其移植到QtConcurrent框架,执行如下所示的操作,如下面链接教程中所述:

 QFuture<void> future = QtConcurrent::run(&this->MyObject, &MyClass::LongFunction);

然后,FutureWatcher对象将根据将来的完成信息更新进度条。

这里有一个完整的示例,说明如何将QProgressBar与QFutures和QtConcurrent一起使用:https://wiki.qt.io/Progress_Bar

将部分完成信息添加到进度条将非常简单,使用signals/slot机制发出适当的信息。

答案 1 :(得分:0)

我不知道您的具体情况,但如果您的计算是一个函数(start_computation()),则可以使用线程QThread是一个很好的解决方案。< / p>

实际上你需要把你的繁重计算放在一个新的线程中。然后,您可以检查主(GUI)线程中的计算进度,并更新进度条。

PS:要查看以正确方式实施QThread的一些示例,您可以参考this SO questionHere

答案 2 :(得分:0)

最好的方法是将start_computation()函数移出到自己的线程中,然后使用signal/slot机制正确更新GUI。 GUI必须始终在主线程上运行,而密集型函数将始终阻止它。

有关如何正确使用QThreads的讨论:http://blog.debao.me/2013/08/how-to-use-qthread-in-the-right-way-part-1/