Qt 防止QDialog隐藏

Qt Prevent QDialog from hiding

在我的应用程序中 windows 都有一个用于设置等的 QDialog 上下文菜单,单击鼠标右键即可访问。在其中一个对话框中,我们想显示一个弹出窗口 (QMessageBox) 警告用户操作,但 Qt 只允许一次打开一个对话框,当打开一个新对话框时,当前对话框被隐藏。当它们失去焦点等时它们也会隐藏,这是我需要维护的功能。

我一直在查看 event filters,我可以使用它来捕获隐藏事件,但我似乎无法阻止隐藏实际发生。返回 true 或在事件上设置 accept 的组合似乎没有任何效果。

bool windowSettings::eventFilter(QObject *object, QEvent *event)
{
    if (object == this && event->type() == QEvent::Hide) {
        QHideEvent *hideEvent = static_cast<QHideEvent *>(event);
        hideEvent->accept();    //Should tell further event calls it has already been dealt with
        return true;    //Should indicate event has been dealt with

    }
    return false;
}

上下文菜单实际上是 QDialog 的自定义实现(我们称它为 myQDialog)。所以我尝试在那里覆盖 hide() 函数并添加 bool preventHiding ,它在新的隐藏函数中使用以确定对话框是否应该真正隐藏。 直接调用hide();会导致被覆盖的函数被调用,但显示确认框或在对话框外单击仍然会触发隐藏事件,但不会触发被覆盖的函数。 (我在代码中存在和不存在事件过滤器的情况下都进行了尝试)。

相反,我覆盖了从 show/hide 调用的 setVisible()。这被一致地调用,我下面的实现阻止对话框关闭,但我无法点击消息框,尽管它仍然显示在原始对话框的顶部。

void myQDialog::setVisible(bool visible)
{
    if(preventHide)
    {
        //Don't hide
    }
    else
    {
        QDialog::setVisible(visible);
    }
}

有没有办法捕获并停止隐藏,或者继续显示原始对话框,同时仍然能够与其创建的消息框进行交互?

也许你可以看看这部分 WindowModality,它似乎允许你管理不同 windows(对话框)

中的输入

你可以把你的消息框做成弹出窗口,很简单!

创建消息框时,给它一个 Window 标志,如下所示:

msgBox.setWindowFlags(Qt::WindowType::Popup);

这意味着它不会对后面的window产生任何影响。

可以找到文档here