我正在 QT 中开发一个 GUI,它根据用户输入执行一些繁重的计算。我在一个函数中进行所有计算,比如start_computation(),因为 start_computation() 函数被称为我的 GUI 挂起,因为它正忙于执行 start_computation() 函数。所以,我想使用 QProgressBar 让用户知道 GUI 正在后台执行某些任务。
在这种情况下实现 QProgressBar 的最佳方法是什么?
3 回答
如果整个复杂计算由一个函数处理,它可以很容易地移植到QtConcurrent框架,执行如下操作,如下面链接的教程中所述:
QFuture<void> future = QtConcurrent::run(&this->MyObject, &MyClass::LongFunction);
然后一个FutureWatcher
对象将根据未来的完成信息更新进度条。
这里有一个关于如何将QProgressBar与 QFutures 和QtConcurrent一起使用的完整示例:https ://wiki.qt.io/Progress_Bar
将部分完成信息添加到进度条将是微不足道的,使用该signals/slot
机制发出适当的信息。
我不知道你的确切情况,但如果你的计算是一个函数(start_computation()
),你可以使用线程并且QThread
是一个很好的解决方案。
实际上,您需要将大量计算放在一个新线程中。然后您可以不时从主(GUI)线程检查计算进度并更新您的进度条。
PS:要查看以正确方式实施的一些示例QThread
,您可以参考这个 SO question和Here。
最好的方法是将你的start_computation()
函数移到它自己的线程中,然后使用该signal/slot
机制正确更新 GUI。GUI 必须始终在主线程上运行,而密集的功能将始终阻止它。
关于如何QThreads
正确使用这里有一个很好的讨论:http ://blog.debao.me/2013/08/how-to-use-qthread-in-the-right-way-part-1/