this->setAttribute(Qt::WA_DeleteOnClose,true)的原理
前言
我们知道Qt::WA_DeleteOnClose
是一个窗口属性标志,表示当窗口关闭时,Qt 会自动删除该窗口对象。这意味着当窗口被关闭时,其关联的对象将被释放,内存也会被回收。但是它会如何释放呢?要经历哪些步骤呢?是直接释放吗?
正文
工作原理:
当你给一个 QWidget
设置了 Qt::WA_DeleteOnClose
属性(即 this->setAttribute(Qt::WA_DeleteOnClose, true)
)时,Qt 内部会在窗口关闭后自动调用 deleteLater
来销毁该对象。这与手动调用 delete
类似,但更加安全。
详细步骤:
-
窗口关闭:当用户关闭窗口时(通过点击窗口的关闭按钮或调用
close()
方法),会触发closeEvent()
。 -
处理
closeEvent()
:在处理closeEvent()
时,Qt 检查Qt::WA_DeleteOnClose
属性是否被设置。如果设置了这个属性,那么在closeEvent()
完成之后,Qt 会自动调用deleteLater()
函数,安排在事件循环的下一次空闲时刻销毁这个对象。 -
删除对象:
deleteLater()
函数不会立即删除对象,它会在事件循环中安排该对象的删除,以避免在处理事件时立即删除可能正在使用的对象。
使用场景:
Qt::WA_DeleteOnClose
常用于临时窗口或者对话框,因为这些窗口通常在关闭后就不再需要保留。如果不设置这个属性,窗口关闭后对象仍然会存在于内存中,直到显式删除。
示例:
SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{
this->setAttribute(Qt::WA_DeleteOnClose, true); // 关闭时自动删除对象
}
在这个例子中,当 SubWidget
被关闭时,Qt 会自动调用 deleteLater()
函数,随后在合适的时间点销毁这个 SubWidget
对象,释放资源。
设置deleteLater()
既然我们知道了this->setAttribute(Qt::WA_DeleteOnClose, true)
的原理,我们也可以在closeEvent
中调用this->deleteLater();
来达到相同的效果。
如
void MyWidget::closeEvent(QCloseEvent *event) {
// 执行一些自定义的关闭逻辑,比如保存数据等
saveData();
// 延迟删除窗口
this->deleteLater();
// 确保关闭事件继续传播
event->accept();
}
总结:
Qt::WA_DeleteOnClose
的主要作用是方便对象生命周期的管理,尤其是那些不需要在关闭后继续存在的窗口或对话框。当窗口关闭时,它会自动安排销毁对象,避免内存泄漏或手动删除对象的麻烦。