1

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

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

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();会导致调用overeidden函数,但显示确认框或在对话框外点击仍会触发hide事件但不会触发override函数。(我在代码中存在和不存在事件过滤器的情况下都试过了)。

相反,我已经覆盖setVisible()了从显示/隐藏中调用的内容。这会被一致地调用,并且我在下面的实现会阻止对话框关闭,但我无法单击消息框,尽管它仍显示在原始对话框的顶部。

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

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

4

2 回答 2

1

你可以让你的消息框弹出,很简单!

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

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

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

文档可以在这里找到

于 2020-02-26T14:26:28.880 回答
0

也许您可以查看这部分WindowModality似乎允许您管理不同窗口中的输入(对话框)

于 2020-02-26T11:00:01.590 回答