Qt close()、reject()、closeEvent的联系

Qt对话框与窗口的关闭和隐藏(QCloseEvent、Qt::WA_DeleteOnClose属性、Qt::WA_QuitOnClose属性)
本文为原创文章,转载请注明出处,或注明转载自“黄邦勇帅(原名:黄勇)
在这里插入图片描述

在这里插入图片描述

1、为方便讲解,本文对以下概念作一区别
 删除:是指窗口被销毁,也就是说窗口不存在了。比如窗口使用new创建的,则表示窗口被delete了,被销毁的窗口不能被再次使用,否则会发生内存错误。
 隐藏:是指窗口不可见,但窗口并未被销毁,使用show()等函数,可以让该窗口再次可见。
 关闭:是指窗口不可见,但窗口有可能是被删除了,也有可能是被隐藏了,这要视情况而定。
 窗口被删除时,会同时删除其子对象,而隐藏则不会。

2、关闭窗口与终止程序
一个(应用)程序通常拥有多个窗口,关闭(或删除)一个窗口,并不一定会使程序终止,Qt中关闭窗口使用QWidget::close()槽函数,终止程序使用的是QCoreApplication::quit()静态槽函数或QCoreApplication::exit()静态函数

3、与关闭部件和终止程序有关的属性
注:以下属性其实是Qt::WidgetAttribute枚举的成员,可使用QWidget::setAttribute()函数进行设置和清除。
①、Qt::WA_DeleteOnClose属性:表示当部件接受到QCloseEvent事件时,是否让Qt删除部件。若该属性为true,则删除部件,否则部件只是隐藏。注意:设置了该属性的部件需要使用new创建,否则会产生内存错误。
②、Qt::WA_QuitOnClose属性:表示当拥有该属性的最后一个部件接受到QCloseEvent事件时,让Qt终止应用程序。默认情况下,所有Qt::Window类型的部件都具有该属性。

4、QWidget类中与关闭窗口有关的函数如下:
①、bool QWidget::close(); //槽
 关闭(即删除或隐藏)部件,若部件关闭成功,则返回true,否则返回false。
②、virtual void QWidget::closeEvent(QCloseEvent* e); //虚拟的,受保护的
 这是QCloseEvent事件的处理函数,默认情况下,该函数接受QCloseEvent事件。该函数通常被重新实现,以确定用户是否需要关闭窗口。

5、close()函数的执行过程如下:
①、首先,向该部件发送QCloseEvent事件(不管部件是否可见)
②、然后判断部件是否接受QCloseEvent事件
 若部件接受该事件(默认值),则继续下一步操作。
 若部件忽略该事件,则取消关闭操作,结束后续的操作。其中最重要的是,不会对Qt::WA_DeleteOnClose属性进行判断,此时该属性不起作用。
③、接着判断部件是否被隐藏了,若未被隐藏,则隐藏,若已被隐藏,则什么也不做。然后继续下一步。
④、再接着判断部件的Qt::_WA_QuitOnClose属性,当具有Qt::WA_QuitOnClose属性的最后一个可见主窗口(即没有父窗口的窗口)被关闭时,会发送QApplication::lastWindowClosed()信号。
⑤、最后判断部件的Qt::WA_DeleteOnClose属性,若该属性为true,则删除该部件,否则什么也不做。至此整个过程结束。
⑥、总结:从以上过程可见,若部件接受QCloseEvent事件,且设置了Qt::WA_DeleteOnClose属性,则会删除该部件,若未设置该属性则只会隐藏该部件。若部件忽略QCloseEvent事件,则直接取消对该部件的关闭操作,该部件既不会被隐藏也不会被删除。由此可见对QCloseEvent事件接受还是忽略决定着对窗口关闭的处理方式,同时对该事件的处理方式与其他事件也是不同的,QCloseEvent::ignore()表示取消关闭操作(也就是说QCloseEvent事件不会被传递给父对象),而QCloseEvent::accept()则表示让Qt继续关闭操作。

7、QCloseEvent事件的发送时机如下:
从窗口菜单选择“关闭”,单击标题栏上的X按钮,调用QWidget::close()函数时。
8、可使用以下方式终止程序
 直接调用quit()或exit()函数
 最后一个具有Qt::WA_QuitOnClose属性的主窗口关闭时,终止程序,若没有这样的主窗口,即使所有的窗口都关闭了程序也不会结束。

9、对话框的关闭过程
对话框的reject()、accept()、done()函数,与QWidget::close()函数相同,唯一的区别是对话框不会发送QCloseEvent事件,因此不能通过QCloseEvent事件来阻止对话框的关闭。注意:此规则仅限于上述3个函数,比如点击对话框窗口的X按钮或右击标题栏选择“关闭”时,仍会发送QCloseEvent事件。若用户在对话框中按下Esc键,会调用QDialog::reject()。为了修改对话框的关闭行为,可以重新实现accept()、reject()或done()函数。
10、删除QObject对象时,会发送destroyed()信号,该信号原型如下:

版权声明:本文为CSDN博主「hyongilfmmm」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hyongilfmmm/article/details/83247688

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值