常见的,桌面程序弹出一个功能窗口,会显示在任务栏上,例如:
this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint);
如果在任务栏的窗口,点击“X”关闭后,会直接调用这个窗口类重载的closeevent,如果仍由其直接传入基类qwidget里的closeevent,就可能直接析构窗口。参考:
close会隐藏窗体 ,会触发closeEvent,你可以自己重写closeEvent来控制隐藏或不隐藏,或自己的逻辑,但是默认情况下是不会触发窗体的析构函数的;如果需要触发析构函数,需要Qt::WA_DeleteOnClose标志影响窗体在内存中的状态。
如果你窗体是new出来的,系统close后触发窗体析构函数:
方法1:setAttribute(Qt::WA_DeleteOnClose); (如果不是new出来的,使用本方法,close可能会出现异常)
方法2: exec后,执行delete 对象即可;
不论是那种,主窗体关闭时候,都会析构销毁;
而很多情况下,我们所实现的“关闭窗口”只是停止界面功能并隐藏而已,并不是直接析构掉了,这有本质区别。
那怎么实现,点击关闭任务栏窗口而不析构窗口呢,简单来说就是在重载函数中拦截
void