【问题标题】:open a dialog behind a modal dialog or after it is closed在模态对话框后面或关闭后打开一个对话框
【发布时间】:2020-04-29 19:45:06
【问题描述】:

我有一个应用程序,它有几个在非 GUI 线程中运行的后台任务,这些任务可能不时需要一些用户交互,因此它们会向主线程发送信号,并且相应的插槽会创建一个对话框并将其显示给用户。同时,任务线程正在阻塞事件循环中等待。一旦用户回答对话框并关闭它,任务事件循环就会发出信号退出并且任务恢复。

但是有一个问题。在 GUI 线程中,我仍然可以使用不时显示一些模式对话框的应用程序。当已经显示了一个模态对话框,然后后台任务请求打开另一个对话框时,这个与任务相关的对话框显示在模态对话框的前面。但是这个新对话框不是模态的,模态对话框隐藏在它后面。因此,非模态的应用程序没有响应,应用程序感觉就像被卡住了。

我的想法是始终在模态对话框后面显示新对话框,我相信我可以通过QApplication::activeModalWidget() 获得。但我不知道该怎么做。如何在另一个对话框后面显示一个对话框,但仍然在主窗口(两个对话框的父窗口)前面?在显示非模态对话框后,我尝试致电QApplication::activeModalWidget()->activateWindow(),但他导致窗口闪烁,而且我仍然可以单击新的非模态对话框隐藏模态对话框。所以这不是一个完美的解决方案。

或者您还有其他解决方案吗?

也许我可以实现一个对话框队列,一旦有任何模态对话框可见,那么新的后台任务相关对话框将不会显示,只有在模态对话框关闭后才排队并显示。然而,这对我来说感觉更脆弱的解决方案。

有什么想法吗?

更新:我通过添加“或关闭后”重新定义了问题,因为这也适用于我。

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    我找到了一个似乎运行良好的解决方案,它仅在模式对话框关闭后才显示非模式对话框。

    QWidget *nonModalDialog = ... // creates the non-modal dialog
    nonModalDialog->setAttribute(Qt::WA_DeleteOnClose);
    QWidget *modalDialog = qApp->activeModalWidget();
    if (modalDialog == nullptr)
    {
        // no modal dialog, we can show the non-modal one now
        dialog->show();
    }
    else
    {
        // we must wait until the modal one is closed
        QObject::connect(modalDialog, &QWidget::destroyed, nonModalDialog, &QWidget::show);
    }
    

    这看起来简单而健壮。

    【讨论】:

      【解决方案2】:

      我认为您正在寻找QWidget::raise()。在非模态对话框上调用 dialog->show() 后,您应该能够使用 QApplication::activeModalWidget()->raise()

      如果您遇到多个模态和非模态对话框的情况,它们都以不同的顺序启动,这可能不足以解决问题。您可能会提出一个模态对话框,只是让其他非模态对话框落后于其他非模态对话框并最终再次卡住。您应该考虑保留对当前活动的模态对话框集合的引用,以便确保它们始终位于非模态对话框的顶部。

      【讨论】:

      • 这绝对是一个有趣的解决方案,但效果与我在调用QApplication::activeModalWidget()->activateWindow() 时提到的相同。模态对话框将被提升,但我仍然可以点击进入新的非模态对话框,它会激活它(尽管它的子小部件不可点击)并隐藏模态对话框。这很奇怪,因为模态应该是禁止激活另一个对话框的模态。这可能是 Qt 中的一个错误。
      猜你喜欢
      • 2015-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-04
      • 1970-01-01
      • 2021-05-30
      • 2010-09-26
      相关资源
      最近更新 更多