当前位置: 首页 > article >正文

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


http://www.kler.cn/a/298748.html

相关文章:

  • RockyLinux介绍及初始化
  • ES 磁盘使用率检查及处理方法
  • Seata AT 模式两阶段过程原理解析【seata AT模式如何做到对业务的无侵入】
  • 使 el-input 内部的内容紧贴左边
  • spring cloud gateway 3
  • 电子电气架构 --- 什么是自动驾驶技术中的域控制单元(DCU)?
  • 海洋运输船5G智能工厂物联数字孪生平台,推进制造业数字化转型
  • 【vue使用Sass报错】启动项目报错 Syntax Error: SassError: expected selector
  • 数据房屋的未来展望
  • clickhouse网络互通迁移一张表数据
  • C++设计模式——Strategy策略模式
  • 反弹shell介绍和应用
  • Flutter之修改App的图标、名称
  • 实现卷积层的前向传播(Pythom版)
  • OpenHarmony鸿蒙开发( Beta5.0)智能油烟机开发实践
  • go 语言常见问题(4)
  • 〖open-mmlab: MMDetection〗解析文件:mmdet/models/roi_heads/bbox_heads/bbox_head.py
  • JavaScript 编程精粹:JavaScript 事件处理
  • Map集合常用API
  • Spring MVC的异步模式(ResponseBodyEmitter、SseEmitter、StreamingResponseBody)
  • element ui form 表单出现英文提示的解决方案
  • QT 联合opencv 易错点
  • QtCreator学习(二).在stm32mp1中使用
  • 歌者PPT新功能速递!
  • Vue3生命周期钩子函数(Vue3生命周期)
  • GO Signal