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
在我的应用程序中 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