【问题标题】:how to implement QProgressBar for heavy computation?如何实现 QProgressBar 进行繁重的计算?
【发布时间】:2016-07-16 16:44:11
【问题描述】:

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

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

【问题讨论】:

标签: c++ qt qt-creator qprogressbar


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 在与您链接到的 wiki 上类似的内置示例中,他们使用 QtConcurrent::map() 并将进度条的 setValue 和取消连接到从 QFutureWatcher 发出的信号'在使用 QtConcurent::run() 时不可用。从链接的示例中工作,我是否会简单地将进度更新信号添加到在 LongFunction 中发出的 MyClass 并将该信号连接到表单中的 ProgressDialog setValue()?如果 MyClass 是 MainWindow 本身可以吗?
【解决方案2】:

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

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

PS:要查看正确实现QThread的示例,您可以参考this SO questionHere

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 我会说尽可能避免与QThreads 混在一起。 QtConcurrent 模块提供的 Qt 中有一个很好的并发 API,可以帮助解决这种情况。特别是当有一个长时间运行的函数完成繁重的工作并且需要在 GUI 线程之外执行时。
    • 由于某种原因,我总是忘记QtConcurrent,但它可能更适合这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多