【发布时间】:2020-04-29 19:45:06
【问题描述】:
我有一个应用程序,它有几个在非 GUI 线程中运行的后台任务,这些任务可能不时需要一些用户交互,因此它们会向主线程发送信号,并且相应的插槽会创建一个对话框并将其显示给用户。同时,任务线程正在阻塞事件循环中等待。一旦用户回答对话框并关闭它,任务事件循环就会发出信号退出并且任务恢复。
但是有一个问题。在 GUI 线程中,我仍然可以使用不时显示一些模式对话框的应用程序。当已经显示了一个模态对话框,然后后台任务请求打开另一个对话框时,这个与任务相关的对话框显示在模态对话框的前面。但是这个新对话框不是模态的,模态对话框隐藏在它后面。因此,非模态的应用程序没有响应,应用程序感觉就像被卡住了。
我的想法是始终在模态对话框后面显示新对话框,我相信我可以通过QApplication::activeModalWidget() 获得。但我不知道该怎么做。如何在另一个对话框后面显示一个对话框,但仍然在主窗口(两个对话框的父窗口)前面?在显示非模态对话框后,我尝试致电QApplication::activeModalWidget()->activateWindow(),但他导致窗口闪烁,而且我仍然可以单击新的非模态对话框隐藏模态对话框。所以这不是一个完美的解决方案。
或者您还有其他解决方案吗?
也许我可以实现一个对话框队列,一旦有任何模态对话框可见,那么新的后台任务相关对话框将不会显示,只有在模态对话框关闭后才排队并显示。然而,这对我来说感觉更脆弱的解决方案。
有什么想法吗?
更新:我通过添加“或关闭后”重新定义了问题,因为这也适用于我。
【问题讨论】: