目录
窗口释放问题
其他办法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。