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