04.对象树

一、引入

1.QT实现输出"hello world"

        使用QT编写"hello world"程序,有两种实现方式:

        (1)直接在生成的ui文件中,拖入一个label控件,双击控件编辑内容即可实现

        (2)通过代码方式实现

2.控件对象创建方式

        在创建控件对象时,我们可以使用QLabel obj的方式直接在栈上创建,也可以用new的方式在堆上创建。

        在上图中可以看到,在创建label控件时是通过new在堆上创建的方式,并且没有进行手动释放,但这并不会造成内存泄漏问题,这是因为在创建该控件时,我还传入了一个this参数,这其实就是将该对象挂载到了QT的对象树中,将其生命周期交给对象树来进行统一管理。

        所以在实际使用中,更推荐以new的方式进行创建

3.为什么推荐new的方式创建

        如果控件对象是在栈上创建,可能产生一些提前释放的问题,导致控件无法正常显示等问题,例如:

二、对象树

1.概念

        对象树是QT在内存中组织所有QT对象的一种数据结构,对象树的根节点是QObject,其子类对象是子节点,子对象在父对象被删除时自动被删除。

2.优点

        (1)将QT对象以树的形式组织起来,更方便管理;

        (2)可以实现对象之间的通信,使得他们可以互相之间发送信号和槽函数;

        (3)可以实现对象的继承,使得子类对象可以继承父类对象的属性和方法;

        (4)一定程度上简化了内存管理。

3.验证

        我们可以自己定义一个MyLabel类,创建对象来观察对象的创建释放过程:

        (1)新建一个C++文件,可以让其继承自QLabel

        (2)编写MyLabel.h

#ifndef MYLABEL_H
#define MYLABEL_H#include <QLabel>class MyLabel : public QLabel
{
public:// 构造函数添加上QWidget*参数// 确保对象能够添加到对象树上MyLabel(QWidget* parent);~MyLabel();};#endif // MYLABEL_H

        (3)在析构函数中,添加日志输出

#include "mylabel.h"
#include <iostream>
MyLabel::MyLabel(QWidget* parent):QLabel(parent)
{}MyLabel::~MyLabel()
{std::cout << "MyLabel destroy" << std::endl;
}

        (4)构造MyLabel对象

        (5)运行程序,"hello world"正常显示

        (6)关闭窗口,查看是否输出日志信息

        (7)存在日志信息,说明其析构函数在窗口销毁时被调用。

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

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

相关文章

RK3568 Android 13 系统裁剪

android 13 系统裁剪是个大工程&#xff0c;裁剪也是需要大量的测试&#xff0c;才能保证系统的稳定性&#xff0c;以下是RK官方给出的裁剪方案&#xff0c;有兴趣的可以去看一下&#xff0c;对裁剪不是要求过高的可以根据官方的建议&#xff0c;对系统进行裁剪: Rockchip And…

wpf 数据转换(Bytes 转 KB MB GB)

效果 后端 using ProCleanTool.Model; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Globalization; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Data;namespace P…

交叉编译opencv运行平台rk3588

opencv版本&#xff1a;4.8.0 opencv_contrib版本&#xff1a;4.8.0 在源码目录下建build目录&#xff0c;进入该目录配置编译选项生成makefile cmake 配置参数&#xff1a; cmake -DCMAKE_MAKE_PROGRAM:PATH/usr/bin/make -DCMAKE_INSTALL_PREFIX/home/rog/my_file/other_L…

uniapp H5 实现上拉刷新 以及 下拉加载

uniapp H5 实现上拉刷新 以及 下拉加载 1. 先上图 下拉加载 2. 上代码 <script>import DragableList from "/components/dragable-list/dragable-list.vue";import {FridApi} from /api/warn.jsexport default {data() {return {tableList: [],loadingHi…

Docker私有仓库搭建

目录 搭建本地私有仓库 Docker--harbor私有仓库部署与管理 Harbor 简介 什么是Harbor Harbor的特性 Harbor的构成 Harbor 部署 部署 Docker-Compose 服务 ​编辑部署 Harbor 服务 启动 Harbor 进入浏览器http://192.168.20.10进入harbor的客户端 搭建本地私有仓库 …

大数据学习之Redis、从零基础到入门(三)

目录 三、redis10大数据类型 1.哪十个&#xff1f; 1.1 redis字符串&#xff08;String&#xff09; 1.2 redis列表&#xff08;List&#xff09; 1.3 redis哈希表&#xff08;Hash&#xff09; 1.4 redis集合&#xff08;Set&#xff09; 1.5 redis有序集合&#xff08…

(十四)测频NE555应用

文章目录 NE555简介NE555原理图如何对NET_SIG&#xff08;P34&#xff09;引脚计脉冲测频应用部分代码现象 NE555简介 NE555是一种集成电路&#xff0c;其内部结构包括比较器、RS触发器、电压比较器和输出级三个主要功能模块。是由硬件直接产生的脉冲 NE555一些的常见应用&am…

Windows11搭建GPU版本PyTorch环境详细过程

Anaconda安装 https://www.anaconda.com/ Anaconda: 中文大蟒蛇&#xff0c;是一个开源的Python发行版本&#xff0c;其包含了conda、Python等180多个科学包及其依赖项。从官网下载Setup&#xff1a;点击安装&#xff0c;之后勾选上可以方便在普通命令行cmd和PowerShell中使用…

当代码遇上玄学……

为什么bug天天出现? 为什么bug遥遥领先? 一杯茶&#xff0c;一包烟&#xff0c;一个bug找一天。 问&#xff1a;程序出现BUG的时候&#xff0c;程序员能做什么&#xff1f; 答&#xff1a;烧香拜佛看运势。 有人相爱&#xff0c;有人在夜里看海&#xff0c;有人在凌晨三点…

光环云与跨境智算云网实验室联合发布“数据全链路安全与合规解决方案”

1月19日&#xff0c;国际数据经济产业创新大会在上海临港新片区召开&#xff0c;光环云受邀出席。会上&#xff0c;光环云与“上海国际数据港创新实验室——跨境智算云网实验室”联合发布“数据全链路安全与合规解决方案”&#xff0c;助力企业数据跨境流动更加便捷、安全、高效…

代码随想录算法训练营DAY6 | 哈希表(1)

DAY5休息一天&#xff0c;今天重启~ 哈希表理论基础&#xff1a;代码随想录 Java hash实现 &#xff1a;java 哈希表-CSDN博客 一、LeetCode 242 有效的字母异位词 题目链接&#xff1a;242.有效的字母异位词 思路&#xff1a;设置字典 class Solution {public boolean isAnag…

openGauss学习笔记-210 openGauss 数据库运维-常见故障定位案例-谓词下推引起的查询报错

文章目录 openGauss学习笔记-210 openGauss 数据库运维-常见故障定位案例-谓词下推引起的查询报错210.1 谓词下推引起的查询报错210.1.1 问题现象210.1.2 原因分析210.1.3 处理办法 openGauss学习笔记-210 openGauss 数据库运维-常见故障定位案例-谓词下推引起的查询报错 210.…