this->setAttribute(Qt::WA_DeleteOnClose,true)的原理

前言

我们知道Qt::WA_DeleteOnClose 是一个窗口属性标志,表示当窗口关闭时,Qt 会自动删除该窗口对象。这意味着当窗口被关闭时,其关联的对象将被释放,内存也会被回收。但是它会如何释放呢?要经历哪些步骤呢?是直接释放吗?

正文

工作原理:

当你给一个 QWidget 设置了 Qt::WA_DeleteOnClose 属性(即 this->setAttribute(Qt::WA_DeleteOnClose, true))时,Qt 内部会在窗口关闭后自动调用 deleteLater 来销毁该对象。这与手动调用 delete 类似,但更加安全。

详细步骤:

  1. 窗口关闭:当用户关闭窗口时(通过点击窗口的关闭按钮或调用 close() 方法),会触发 closeEvent()

  2. 处理 closeEvent():在处理 closeEvent() 时,Qt 检查 Qt::WA_DeleteOnClose 属性是否被设置。如果设置了这个属性,那么在 closeEvent() 完成之后,Qt 会自动调用 deleteLater() 函数,安排在事件循环的下一次空闲时刻销毁这个对象。

  3. 删除对象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 的主要作用是方便对象生命周期的管理,尤其是那些不需要在关闭后继续存在的窗口或对话框。当窗口关闭时,它会自动安排销毁对象,避免内存泄漏或手动删除对象的麻烦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值