首页 新闻 会员 周边

有关 Qt 子控件 ignore() 了事件之后父控件却没有接收到传来的事件的问题

0
悬赏园豆:10 [待解决问题]

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();
}

运行程序后 ,点击按钮 ,发现每次点击时按钮都会捕捉到事件 ,同时显示事件是放行状态 ,但是主窗口却根本捕捉不到关闭事件 。我亲自点击主窗口的红叉之后才显示主窗口捕捉到关闭事件。

YASJUN的主页 YASJUN | 初学一级 | 园豆:149
提问于:2022-04-11 11:03
< >
分享
所有回答(1)
0

此现象完全正常,并不是所有事件都会传递给父组件,在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中重写该事件。

Smalldy | 园豆:430 (菜鸟二级) | 2022-07-07 10:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册