1.可以看见 ,按钮的父对象是主窗口
1 //初始化按钮 2 butt.setText("按钮"); 3 butt.setParent(this);
2.按钮点击后将会关闭自己
//绑定信号和槽 connect(&butt,&MyButton::pressed,this, [=]() mutable { butt.close(); });
3.按钮捕捉到关闭事件时会 ignore 掉
//覆写按钮关闭事件处理函数 void MyButton::closeEvent(QCloseEvent *e) { //测试是否捕捉到事件 qDebug() << "按钮捕捉到事件,指针是:"<<e<<endl; //拒绝关闭事件在该控件处执行 ,并把事件对象指针放行至主窗口 e->ignore(); qDebug() << "当前放行状态:" << e->isAccepted() << endl; }
4.主窗口会接收传来的关闭事件
//覆写主窗口关闭事件处理函数 void MainWindow::closeEvent(QCloseEvent *e) { //测试是否捕捉到事件 qDebug() << "窗口捕捉到事件,指针是:"<<e<<endl; //承认事件 e->accept(); }
运行程序后 ,点击按钮 ,发现每次点击时按钮都会捕捉到事件 ,同时显示事件是放行状态 ,但是主窗口却根本捕捉不到关闭事件 。我亲自点击主窗口的红叉之后才显示主窗口捕捉到关闭事件。
此现象完全正常,并不是所有事件都会传递给父组件,在Qt文章中,对于QCloseEvent
有一段这样的描述
...When a widget accepts the close event, it is hidden (and destroyed if it was created with the Qt::WA_DeleteOnClose flag). If it refuses to accept the close event nothing happens...
也就是说,如果选择忽略事件,则不会发生任何事。
同时,我们可以参阅QKeyEvent
文档,它是这样描述的:
.....Calling ignore() on a key event will propagate it to the parent widget. ....
结论是:关闭事件不会向父组件传递。请手动调用它的close()
函数来触发关闭事件,然后在closeEvent
中重写该事件。