在我的应用程序窗口中,都有一个用于设置等的 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);
}
}
有没有办法捕获并停止隐藏,或者在仍然能够与它创建的消息框交互的同时继续显示原始对话框?