QT:非模态使用WA_DeleteOnClose避免内存泄漏

cpp 复制代码
connect(ui->actionnewFile,&QAction::triggered,this,[=](){
      QDialog*dlg = new QDialog(this);
      //dlg.exec();
      dlg->show();
      dlg->setAttribute(Qt::WA_DeleteOnClose);
      qDebug()<<"打开对话框";
    });
  1. `QDialog* dlg = new QDialog(this);
  • 创建了一个 `QDialog` 对象 `dlg`,并将其父对象设置为当前对象(`this`)。这意味着 `dlg` 的生命周期与父对象相关联,但父对象不会自动删除 `dlg`,除非显式设置。
  1. dlg->show();
  • 调用 `show()` 方法将对话框显示出来。它是一个非模态对话框,用户可以在对话框显示的同时与主窗口交互。
  1. dlg->setAttribute(Qt::WA_DeleteOnClose);
  • 为对话框设置 `Qt::WA_DeleteOnClose` 属性。这意味着当用户关闭对话框时(例如点击关闭按钮或调用 `close()` 方法),对话框对象会自动被删除,从而避免内存泄漏。

关于 `dlg->exec()` 和 `dlg->show()`

dlg->exec();`

  • `exec()` 是一个模态对话框的显示方式。它会阻塞调用它的线程,直到对话框关闭。在对话框关闭后,程序才会继续执行 `exec()` 之后的代码。

  • 如果你使用 `exec()`,通常不需要手动设置 `Qt::WA_DeleteOnClose`,因为模态对话框通常在关闭后会立即被处理。

dlg->show();

  • `show()` 是非模态对话框的显示方式。它不会阻塞主线程,用户可以在对话框打开的同时与主窗口交互。

  • 在这种情况下,设置 `Qt::WA_DeleteOnClose` 是一个很好的实践,以确保对话框在关闭时被正确删除。

总结
**- `dlg->setAttribute(Qt::WA_DeleteOnClose);` 的作用是**声明**对话框在关闭时自动删除自己,避免内存泄漏。

  • 如果你使用 `show()` 显示对话框,建议设置 `Qt::WA_DeleteOnClose`。
  • 如果你使用 `exec()` 显示对话框,通常不需要设置 `Qt::WA_DeleteOnClose`,因为模态对话框的生命周期通常由代码逻辑控制。**
相关推荐
云水初5 分钟前
【agent篇】RAG Agent避坑指南(附高级RAG Agent汇总)
开发语言·笔记·python·学习·langchain·agent·rag
Littlehero_1217 分钟前
QT自定义控件之水泥厂组态(源码开源)
开发语言·qt
辛苦才能16 分钟前
C++ 哈希表深度解析:删除为什么必须打标记,负载因子为什么卡 0.7
开发语言·数据结构·c++·算法
miller-tsunami26 分钟前
STL简介&string相关知识点
开发语言·c++·string
半摆烂日常1 小时前
手机表单的左滑操作:触摸事件的处理细节
大数据·开发语言·人工智能·智能手机·https·c#
星夜离尘561 小时前
MATLAB滑动RMS如何接报警:窗口未满和缺样不能当成正常
开发语言·matlab
开开心心就好1 小时前
白天晚上自动调蓝光,护眼工具亮度可调
服务器·开发语言·算法·pdf·ocr·intellij-idea·idea
张张123y1 小时前
后端第十一课:RAG 落地实战(从 0 到 1 接上私有知识库,并设计一个好用的 RAG)
开发语言·人工智能·python·机器学习·fastapi·rag
梅梅绵绵冰1 小时前
JVM虚拟机
java·开发语言·jvm
Shaoshing2 小时前
消息顺序
java·开发语言