我已经连接了一个使用Qt的应用程序。应用程序经常显示弹出窗口,当弹出窗口关闭时,弹出对话框的父窗口也会关闭。
我编写了一个EventFilter,它应该阻止父窗口关闭。我可以在调试器中看到调用了EventFilter,但是窗口仍然关闭。
这是过滤器:
bool CloseEventFilter::eventFilter(QObject* object, QEvent* event){
printf("%s\n", parseEvent(event).c_str());
if(event->type() == QEvent::Close){
event->accept();
return true;
}
if(event->type() == QEvent::Hide){
event->accept();
return true;
}
if(event->type() == QEvent::HideToParent){
event->accept();
return true;
}
if(event->type() == QEvent::Destroy){
event->accept();
return true;
}
if(event->type() == QEvent::DeferredDelete){
event->accept();
return true;
}
if(event->type() == QEvent::ChildRemoved){
event->accept();
return true;
}
return false;
}
过滤器是否有任何问题?还有其他方法吗?
答案 0 :(得分:0)
CloseEvent
不是通过关闭窗口处理的事件。关闭窗口是在事件被触发之后触发的。因此,在过滤器中接受事件可能会阻止它传播,但不会停止关闭窗口。
在抓住CloseEvent
时,您有机会忽略该事件,而不是接受它。窗口关闭仅在事件被接受时发生,这是默认值。
如果事件的接收者同意关闭小部件,则isAccepted()函数返回true;如果此事件的接收者不希望关闭窗口小部件,则调用accept()同意关闭窗口小部件并调用ignore()。
这意味着您需要在代码中调用event->ignore()
而不是event->accept()
。