【问题标题】:QT progress dialog cancel button not highlightedQT 进度对话框取消按钮未突出显示
【发布时间】:2010-08-16 14:58:44
【问题描述】:

我有一个使用 20 个不同类的应用程序。程序执行在主窗口中开始。我开始一个进度对话框。我将针对不同的目的使用不同的类。在执行到特定类并执行所需并返回主窗口类的每个函数调用之后,我将更新进度对话框。现在,问题是当执行离开主窗口类时进度对话框冻结。无法访问取消按钮,因此无法在所需时间停止执行。

主类::主类() {

ProgressDialog->exec();

x->add();

updateProgressDialog();

y->do();

updateProgressDialog();

zz->bring();

updateProgressDialog();

}

// x, y, z 是三个不同的类。

这就是执行的方式。一旦我在主类中输入函数,我将启动进度对话框。并调用不同类的函数。这些功能需要相当长的时间。我已经调用了一个线程来执行执行部分,但我无法取消进度对话框。我希望在进度对话框上按下取消按钮时停止程序执行。

请告诉我如何解决这个问题。希望我在这里很清楚。

【问题讨论】:

  • 您提到您调用一个线程来执行执行部分。这是否意味着 x->add()、y->do() 和 zz-bring() 移交给线程并立即返回?

标签: qt progressdialog


【解决方案1】:

如果不确切知道线程中正在执行哪些计算,就很难隔离问题。也许这会有所帮助:Keeping the GUI Responsive

摘自:执行长期操作(作者:Witold Wysota)
在长时间计算期间(无论使用任何信号和插槽),所有事件处理都会停止。结果,GUI 没有刷新,用户输入没有被处理,网络活动停止并且计时器没有触发——应用程序看起来像是被冻结了,事实上,与耗时任务无关的部分是冷冻。

【讨论】:

    【解决方案2】:

    您正在调用的函数未处理 Qt 事件循环。您正在使用模态进度条,因为您正在调用 exec()。这意味着 Qt 只会在您更新对话框时获得控制权。

    我知道解决此问题的唯一方法是将对话框编码为无模式,但您还必须为事件循环提供处理的机会。

    这在 Qt 文档中有相当详细的解释:QProgressDialog

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-27
      • 2020-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多