Qt 关闭app窗口自动销毁相关问题

目录

窗口释放问题

其他办法1.

办法2.

办法3.


窗口释放问题

关于窗口关闭之前学习MFC时候,app窗口关闭,new出来的对象都会被释放掉。但是到了Qt这边,我们new出来窗口,app点击关闭发现主窗口关闭了,但是new出来的窗口没有关闭。其实这里关闭只是隐藏,并没有真正关闭。那这时候如果上实现真正的delete,则需要设置窗口DeleteOnClose属性,这样子窗口申请内存就真正释放掉了

    QWidget *qui = new QWidget;
    qui->setTitle("新窗体测试");
    qui->setAlignment(Qt::AlignCenter);
    qui->setAttribute(Qt::WA_DeleteOnClose, true);
    qui->show();

 当然我们也可以,在new的时候将主窗口this传入(可能会导致new 窗口qss异常),也是可以的。

其他办法1.

此外如果需要直接退出某个应用程序,可以直接调用Qt中的一个全局指针:qApp ,全局指针qApp指向全局的QApplication对象,可以在Qt说明文档中直接找到,不是main函数定义的QApplication对象(QApplication对象也可以退出,使用 app->exit(0);或者 app->quit();)
qApp->quit()关闭的是整个应用程序,不只是窗口,
一般情况下关闭窗口应用程序会直接退出,如果要求关闭窗口时,应用程序不退出,则需要设置QApplication的属性:
QApplication::setQuitOnLastWindowClosed(false);

办法2.

QWidget的close槽函数是像widget发送QCloseEvent,如果widget未设置Qt::WA_DeleteOnClose标志的话,将隐藏widget,并不会销毁相关资源。如果设置了该标志,那么会再发送destroy信号,销毁相关资源。

(多说一句:QWindow的close槽是调用destroy来销毁窗口资源的。不过我们一般不直接使用QWindow。)

Qt帮助文档中的介绍:

调用close()方法后首先它会向widget发送一个关闭事件(QCloseEvent)。如果widget接受了关闭事件(QCloseEvent),窗口将会隐藏(实际上调用hide())。
如果widget不接受关闭事件,那么窗口将什么也不做。默认情况下widget会接受关闭事件,我们可以重写QCloseEvent事件,可以选择接受或者不接受。

如果widget设置了Qt::WA_DeleteOnClose属性,widget将会被释放。不管widget是否可见,关闭事件都会传递给widget。即接收到QCloseEvent事件后,
除了调用hide()方法将窗口隐藏,同时会调用deleteLater()方法将窗口释放掉,不会再占用资源。

所以说调用close()并不一定就会将窗口对象销毁。而只有设置了 Qt::WA_DeleteOnClose属性才会删除销毁。如果这个属性没有设置,close()的作用和hide(),
setvisible(false)一样,只会隐藏窗口对象而已,并不会销毁该对象。


办法3.

根据2我们知道关闭窗口会调用QCloseEvent,那我们在里面讲new窗口hide(),软件就关掉了。(其实关于这里,隐藏之后销毁对象应该是Qt去处理的)

办法4.

使用信号跟槽办法(lastWindowClosed)

当最后一个可见的主窗口(即没有父窗口)关闭时,这个信号从exec()发出。
默认情况下,QGuiApplication在发出这个信号后退出。这个功能可以通过设置quitOnLastWindowClosed为false来关闭

//例如 main函数里
QApplication a( argc, argv );
MainWindow *mw = new MainWindow();
mw->setCaption( "Qt Example - Addressbook" );
a.setMainWidget( mw );     //    必须设定主窗口
mw->show();
a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()));

除此之外如果我们要是删除窗口的话,属性setAttribute(Qt::WA_DeleteOnClose)所有窗口部件(QWidget及子类)该属性设置为true,除了短暂的窗口,如闪屏、工具窗口和弹出菜单该属性设置为false。但Qt的父子对象系统会以父对象(最顶层)为最后关闭时才退出应用程序(最后调用quit())。

QGuiApplication::setQuitOnLastWindowClosed(true);//默认情况下该属性设置为true。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路奇怪

有钱出钱,没钱多出编程主意啊

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值