欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > QT:非模态使用WA_DeleteOnClose避免内存泄漏

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

2025/5/9 11:55:20 来源:https://blog.csdn.net/weixin_57112913/article/details/146244640  浏览:    关键词:QT:非模态使用WA_DeleteOnClose避免内存泄漏
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`,除非显式设置。

2. dlg->show();
   - 调用 `show()` 方法将对话框显示出来。它是一个非模态对话框,用户可以在对话框显示的同时与主窗口交互。

3. 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`,因为模态对话框的生命周期通常由代码逻辑控制。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词