Qt窗体自动销毁

Qt中通过对象树的方式,实现了窗体自动析构,只要我们使用得当,就能免去自己去释放窗体对象的内存,但是我们得清楚Qt窗体自动析构的机制,什么情况下能够自动析构,什么情况不能。操作不当的情况可能造成内存泄漏,甚至会出现程序崩溃问题。

下面通过一系列示例进行探究。

设置父窗体

这种情况规则最简单,在创建窗体或控件时,指定其parent对象,当parent对象销毁时,则会析构该窗体。

QComboBox* cbx=new QComboBox(this);//this窗体被析构时,cbx自动析构

Qt中如果一个widget创建时没有指定parent,但是被其他窗体设置为centerWidget()后
其他窗体析构时,该窗体能正常析构

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{MyWidget* w=new MyWidget();//MainWindow将成为w的父窗体this->setCentralWidget(w);
}
设置窗体关闭时自动销毁

Qt中如果一个widget没有指定parent,但设置setAttribute(Qt::WA_DeleteOnClose);
该窗口关闭时析构

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//w作为一个独立的窗体展示,点击关闭按钮后,窗体自动析构MyWidget* w=new MyWidget();w->show();w->setAttribute(Qt::WA_DeleteOnClose);
//    this->setCentralWidget(w);
}

Qt中如果一个widget没有指定parent,且没有设置setAttribute(Qt::WA_DeleteOnClose);
该窗口关闭时不会析构,主窗口关闭后,该窗口也不会析构

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//w作为一个独立的窗体展示,关闭后,并不会销毁MyWidget* w=new MyWidget();w->show();
}
放入父窗体的布局之中

如果一个控件在new时没有指定parent,但是放在了一个另窗体的布局中,该窗体关闭时
该控件将析构。将控件放入一个窗体的布局中时,将自动设置该窗体为控件的父窗体。
 

MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{MyLineEdit* edit=new MyLineEdit();//没有指定parentQVBoxLayout* layout=new QVBoxLayout();layout->addWidget(edit);//放在一个widget的布局中this->setLayout(layout);//当放入到当前窗体的布局中时,当前窗体将成为edit的父窗体
}
指定父窗体,又放入布局

Qt中,如果一个控件指定了widget1作为parent,但是又放在了widget2的布局中
在widget2被析构的时候,该控件将被析构
 

MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{MyLineEdit* edit=new MyLineEdit(parent);//指定widget1作为parentQVBoxLayout* layout=new QVBoxLayout();layout->addWidget(edit);//edit的实际parent已经更改为widget2( this, MyWidget*)this->setLayout(layout);
}

其他设置父窗体的场景
控件放入表格中

Qt中,将一个编辑框放置在一个表格中,当表格被析构的时候,编辑框也被析构

MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{MyLineEdit* edit=new MyLineEdit(parent);QTableWidget* table=new QTableWidget(this);table->setColumnCount(2);table->setRowCount(2);table->setCellWidget(0,0,edit);//表格table析构时,edit也被析构QVBoxLayout* layout=new QVBoxLayout();layout->addWidget(table);this->setLayout(layout);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/132546.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode:2926. 平衡子序列的最大和 【树状数组维护最大前缀和】

题目链接 lc2926 题目描述 题目思路 定义b[i] nums[i] - i 目标是从b中找到一个非降子序列使得元素和最大 # b[i] nums[i] - i # 找到b的一个非降子序列使得元素和最大 # f[i]: 子序列最后一个数下标是i,对应的最大子序列 # f[i] max (max f[j], 0) nums[i] …

【Python机器学习】零基础掌握GradientBoostingClassifier集成学习

什么能有效地解决分类问题,特别是在数据复杂、特征多样的情况下? 面对这个问题,许多人可能会想到复杂的神经网络或深度学习方法。然而,有一种称为“梯度提升分类器”(Gradient Boosting Classifier)的算法,以其高准确度、灵活性和易用性赢得了大量用户的青睐。 假设在…

计算机编程软件编程基础知识,中文编程工具下载分享

计算机编程软件编程基础知识,中文编程工具下载分享 给大家分享一款中文编程工具,零基础轻松学编程,不需英语基础,编程工具可下载。 这款工具不但可以连接部分硬件,而且可以开发大型的软件,象如图这个实例…

KaiOS Data业务代码调试验证方法(无需项目全编)

KaiOS数据业务上层代码主要在DataCallManager实现。 源码:gecko/dom/system/gonk/radio 手机路径:在system/b2g/omni.ja压缩包modules目录找到DatacallManager.jsm Note:跟一般APP调试有差异,omni.ja不是常规的压缩包&#xff…

idea集成测试插件替代postman

idea集成测试插件替代postman 兄弟萌,你再测试接口是否无bug是否流畅的时候是否还在使用“postman”来回切换进行测试呢? 页面切换进行测试,有没有感觉很麻烦呢? 打开postman,输入接口地址,有没有感觉很麻烦…

关于网站安全的一些讨论

互联网的普及和发展为企业和个人提供了巨大的机会,但同时也伴随着网络安全威胁的增加。网站被攻击是一个常见的问题,可能导致数据泄露、服务中断和声誉受损。在本文中,我们将探讨与网络安全紧密相关的因素,分析为什么网站容易受到…

SpringBoot+Swagger详细使用方法

一、接口文档概述 swagger是当下比较流行的实时接口文文档生成工具。接口文档是当前前后端分离项目中必不可少的工具,在前后端开发之前,后端要先出接口文档,前端根据接口文档来进行项目的开发,双方开发结束后在进行联调测试。 二…

const报错

先上错误: …/include/rectangle.h: In instantiation of ‘R_START_TREE::Rectangle& R_START_TREE::Rectangle::operator(const R_START_TREE::Rectangle&) [with long long unsigned int dimensions 3]’: rectangle_test.cpp:50:41: required from h…

阿里云安全恶意程序检测(速通一)

阿里云安全恶意程序检测 赛题理解赛题介绍赛题说明数据说明评测指标 赛题分析数据特征解题思路 数据探索数据特征类型数据分布箱型图 变量取值分布缺失值异常值分析训练集的tid特征标签分布测试集数据探索同上 数据集联合分析file_id分析API分析 特征工程与基线模型构造特征与特…

vcenter跨版本升级

vcenter跨版本升级(比如从6.7升级到7.0)1.如果您有VCHA,需要关闭移除 vCenter HA 配置 2. 一定要先做好VC的备份 将VC做一个内存快照以便备份 3.下载好后,在电脑上解压镜像ISO,进入这个文件夹运行程序,并…

性能优化之懒加载 - 基于观察者模式和单例模式的实现

一、引入 在前端性能优化中,关于图片/视频等内容的懒加载一直都是优化利器。当用户看到对应的视图模块时,才去请求加载对应的图像。 原理也很简单,通过浏览器提供的 IntersectionObserver - Web API 接口参考 | MDN (mozilla.org)&#xff0c…

深入理解强化学习——多臂赌博机:10臂测试平台

分类目录:《深入理解强化学习》总目录 为了大致评估贪心方法和 ϵ − \epsilon- ϵ−贪心方法相对的有效性,我们将它们在一系列测试问题上进行了定量比较。这组问题是2000个随机生成的 k k k臂赌博机问题,且 k 10 k10 k10。在每一个赌博机问…

【Head First 设计模式】-- 观察者模式

背景 客户有一个WeatherData对象,负责追踪温度、湿度和气压等数据。现在客户给我们提了个需求,让我们利用WeatherData对象取得数据,并更新三个布告板:目前状况、气象统计和天气预报。 WeatherData对象提供了4个接口: …

从零入门Chrome插件开发

什么是 Chrome 插件 谷歌浏览器在推出时就以其快速、安全和简洁的特点受到了广大用户的欢迎。随着浏览器的不断发展,谷歌为用户提供了插件开发平台,使开发者能够为浏览器添加各种功能和定制化选项。从此,插件成为了提升用户体验和个性化的重…

AI:54-基于深度学习的树木种类识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

318. 最大单词长度乘积

318. 最大单词长度乘积 难度: 中等 来源: 每日一题 2023.11.06 给你一个字符串数组 words ,找出并返回 length(words[i]) * length(words[j]) 的最大值,并且这两个单词不含有公共字母。如果不存在这样的两个单词,返回 0 。 示例 1&…

Canvas 梦幻树生长动画

canvas可以制作出非常炫酷的动画&#xff0c;以下是一个梦幻树的示例。 效果图 源代码 <!DOCTYPE> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <title>梦幻数生长动画</title&…

【数据结构】树与二叉树(二):树的表示C语言:树形表示法、嵌套集合表示法、嵌套括号表示法 、凹入表示法

文章目录 5.1 树的基本概念5.1.1 树的定义5.1.2 森林的定义5.1.3 树的术语5.1.4 树的表示1&#xff0e;树形表示法2&#xff0e;嵌套集合表示法结构体创建树主函数 3&#xff0e;嵌套括号表示法结构体创建树嵌套括号表示法主函数 4&#xff0e;凹入表示法结构体创建树凹入表示法…

O(1)时间复杂度通过位运算来判断两字符串是否有公共字符方法

判断两个字符串是否有公共字符暴力做法需要O(n^2)&#xff0c;而通过位运算优化&#xff0c;可以节省不少时间复杂度。 以小写26字母为例&#xff0c;判断两个字符串是否存在公共字符。 使用位运算&#xff0c;创建一个长度为2的数组&#xff0c;每个位置的长度为26&#xff…

ABC 327

比赛传送门 引 A,B,C题太水了不想写了&#xff0c;G太难了不会 所以记录一下D,E,F 正文 ——————————————————————————————————— D. Good Tuple Problem 题目传送门 解法1 建图跑 D f s Dfs Dfs ,判断是否为二分图 时间复杂度 O (…