一般情况下,顶层窗口调用close,本窗口销毁并销毁所有子部件;非顶层窗口调用close,窗口只是隐藏,并不销毁。这里所说的一般,指的是只有一个顶层窗口的情况。
而对于有多个顶层窗口的程序,情况并不是如此,因为所有窗口都生存在一个QApplication中,只有最后一个窗口关闭(close())之后 程序才会调用主窗口的析构函数来销毁窗口。
这里要注意的是,销毁时调用的是主窗口,也就是在main()函数中创建的窗口的析构函数。如果一个窗口是主窗口中某个函数中在堆上new出来的,而且没有父指针,那么这个窗口将会不被析构(因为指向它的指针已经消亡,程序无法掌控这个窗口),就产生了内存泄露。那么,如何解决呢?有两种方法,一种是指定父对象,通过父对象来销毁,不成为野窗口;另一种解决方法是,利用下面所说的方法,让这个窗口在close的时候自杀销毁(因为尽管是野窗口,但依然可以通过事件close)。
对于子对象,默认关闭(也就是上面所说的close)只是隐藏,并不销毁,此时可以通过设置Qt::WA_DeleteOnClose,来指明关闭时候销毁,这个设置可以使用函数setAttribute(Qt::WA_DeleteOnClose);来完成。也就是说,当我们有一个子对象(也就是用父对象的指针初始化的对象),如果我close掉这个子对象,实际子对象依然存在,只是隐藏了,没有被销毁。但是如果我们使用上面的方法设置标记位,那么当我们关闭子对象的时候,它就会被销毁了。
Qt基于C++用来编GUI程序
网友评论