3

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

主类::主类() {

ProgressDialog->exec();

x->add();

updateProgressDialog();

y->do();

updateProgressDialog();

zz->bring();

updateProgressDialog();

}

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

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

请让我知道如何摆脱这个问题。希望我在这里很清楚。

4

2 回答 2

1

如果不确切知道线程中正在执行什么计算,就很难隔离问题。也许这会有所帮助:保持 GUI 响应

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

于 2010-08-16T20:54:25.733 回答
0

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

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

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

于 2010-08-16T22:59:40.050 回答