我刚刚写了一些基于 QThread 的代码来执行一个大的计算。为了可视化进度,我需要打开一个 QProgressDialog。该对话框是应用程序模式(使用 open()),因为我不想在计算期间允许修改主窗口。线程发出各种信号,允许在 GUI 和线程之间进行基于状态机的通信。
线程的工作对象发出的两个信号是“Progress”和“Finished”。如果发出“Progress”,我将使用 setValue() 更新 QProgressDialog。如果发出“Finished”,则对话框被销毁。
在计算结束时会发生以下情况:
- 发出“进度”事件 (100%)
- “完成”后直接发出
- 由于“进度”事件而调用 setValue(100)
- 因为对话框是模态的,所以 setValue() 调用 processEvents()
- processEvents() 传递“Finished”事件
- “Finished”事件导致 Dialog 在 setValue() 中间被销毁,从而导致崩溃
QProgressDialog 通过在 setValue() 中调用 processEvents() 来破坏我的架构。此外,我的编码约定禁止使用任何嵌套的事件循环(如在 exec() 等中)。
我有两个问题:
为什么模态对话框需要嵌套事件循环?从我的理解来看,阻止父窗口的输入似乎不需要这个。
是否可以以模态方式使用 QProgressDialog 但没有嵌套事件循环?