如何为繁重的计算实现 QProgressBar?

how to implement QProgressBar for heavy computation?

我正在 QT 中开发一个 GUI,它根据用户输入执行一些繁重的计算。我在一个函数中进行所有计算说 start_computation() ,因为 start_computation() 函数被称为我的 GUI 挂起,因为它正忙于执行 start_computation() 函数。所以,我想使用 QProgressBar 让用户知道 GUI 正在后台执行某些任务。

在这种情况下,实现 QProgressBar 的最佳方法是什么?

我不知道你的具体情况,但如果你的计算是一个函数 (start_computation()),你可以使用 threadQThread 是一个很好的解决方案。

事实上,您需要将繁重的计算放在新线程中。然后您可以不时地从主(GUI)线程检查计算进度并更新您的进度条。

PS: 要查看以正确方式实现 QThread 的示例,您可以参考 this SO question and Here.

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

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

如果整个复杂的计算由一个函数处理,它可以很容易地移植到 QtConcurrent 框架,做类似下面的事情,如下面链接的教程中提到的:

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

一个FutureWatcher对象会根据未来的完成信息更新进度条。

有一个关于如何使用的完整示例 QProgressBar with QFutures and QtConcurrent in general here: https://wiki.qt.io/Progress_Bar

向进度条添加部分完成信息将是微不足道的,使用 signals/slot 机制发出适当的信息。