阻止Qt窗口关闭钩子应用程序,Eventfilter什么都不做

时间:2016-05-01 11:41:16

标签: c++ qt hook

我已经连接了一个使用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;

}

过滤器是否有任何问题?还有其他方法吗?

1 个答案:

答案 0 :(得分:0)

CloseEvent不是通过关闭窗口处理的事件。关闭窗口是在事件被触发之后触发的。因此,在过滤器中接受事件可能会阻止它传播,但不会停止关闭窗口。

在抓住CloseEvent时,您有机会忽略该事件,而不是接受它。窗口关闭仅在事件被接受时发生,这是默认值。

  

如果事件的接收者同意关闭小部件,则isAccepted()函数返回true;如果此事件的接收者不希望关闭窗口小部件,则调用accept()同意关闭窗口小部件并调用ignore()。

这意味着您需要在代码中调用event->ignore()而不是event->accept()