如何为繁重的计算实现 QProgressBar?
how to implement QProgressBar for heavy computation?
我正在 QT 中开发一个 GUI,它根据用户输入执行一些繁重的计算。我在一个函数中进行所有计算说 start_computation() ,因为 start_computation() 函数被称为我的 GUI 挂起,因为它正忙于执行 start_computation() 函数。所以,我想使用 QProgressBar 让用户知道 GUI 正在后台执行某些任务。
在这种情况下,实现 QProgressBar 的最佳方法是什么?
我不知道你的具体情况,但如果你的计算是一个函数 (start_computation()
),你可以使用 thread 而 QThread
是一个很好的解决方案。
事实上,您需要将繁重的计算放在新线程中。然后您可以不时地从主(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
机制发出适当的信息。
我正在 QT 中开发一个 GUI,它根据用户输入执行一些繁重的计算。我在一个函数中进行所有计算说 start_computation() ,因为 start_computation() 函数被称为我的 GUI 挂起,因为它正忙于执行 start_computation() 函数。所以,我想使用 QProgressBar 让用户知道 GUI 正在后台执行某些任务。
在这种情况下,实现 QProgressBar 的最佳方法是什么?
我不知道你的具体情况,但如果你的计算是一个函数 (start_computation()
),你可以使用 thread 而 QThread
是一个很好的解决方案。
事实上,您需要将繁重的计算放在新线程中。然后您可以不时地从主(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
机制发出适当的信息。