Qt初识 - 编写Hello World的两种方式 | 对象树

目录

一、通过图形化方式,在界面上创建出一个控件

二、通过代码方式,创建Hello World

三、Qt 内存泄漏问题

(一) 对象树


一、通过图形化方式,在界面上创建出一个控件

创建项目后,打开双击forms文件夹中的ui文件,可以进入到图形化设计ui的界面。

在左侧找到Display Widgets模块,将Label拉到

双击这个Label模块。可以进行修改,在右下角,也可以对这个控件进行修改。

修改之后,我们的界面相当于存在了一个Label的控件。

在Qt Designer右上角,通过树形结构,显示出来当前界面上都有哪些控件。

保存之后,查看头文件,源文件,其实并没有任何变化,

当我用文本编辑器打开ui文件的时候,会发现多出了一段代码。

在我们运行的时候,会自动的根据多出来的几段代码,编译出来带有Hello World界面的程序。

二、通过代码方式,创建Hello World

一般通过代码来构造界面的时候,通常会把构造界面的代码放到Widget的构造函数中。

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    QLabel *label = new QLabel(this); // 创建Label对象
    label->setText("Hello World"); // 设置控件中,要显示的文本文件
}

Qt诞生于1991年,当时C++还没有形成标准,C++更没有标准库这样的改变,当时如何表示一个字符串,可以使用C风格字符串,也可以使用C++的string,Qt为了让自己的开发变得顺畅,就自己发明了一套轮子,搞了一系列的基础类,来支持Qt的开发,包括不限于:字符串QString,动态数组QVector,链表QList,字典QMap等等。

很多年之后,C++中的容器等已经打磨的很好了,但是Qt自己包装好的这些容器类,也不可能删除,就只能和现有的标准库中的容器类共存了。


在QString中,也提供了C风格字符串作为参数的构造函数,不显示构造QString。

运行程序,就显示出了Hello World了,只不过是在左上角,默认的就是在左上角,如果想放到其他位置,可以通过resize来设置。

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    QLabel *label = new QLabel(this); // 创建Label对象
    label->setText("Hello World"); // 设置控件中,要显示的文本文件
    label->resize(230,240);
}

三、Qt 内存泄漏问题

上面的代码中,label是new出来的一个对象,但是最后却没有使用delete,这不会出现内存泄漏问题吗?内存泄漏,文件描述符泄露等同类问题都是非常严重的。

上述代码并不会产生内存泄漏。label对象会在合适的时候被析构释放(虽然没有手写delete,但却是能释放)

之所以能够把对象释放掉,主要是因为把这个对象是挂到了对象树上。

(一) 对象树

可以看到这个结构类似于一个树形,这里的树上的每一个结点都是一个对象,通过这个树形结构,就把界面上要显示的这些控件都组织起来了。这里的树上的这些对象,统一销毁是最好不过的,如果某个对象提前销毁,此时就会导致对应的控件就在界面上不存在了。所以前面代码中,通过new的方式创建对象,也就是为了把这个对象的生命周期,交给Qt的对象树统一来进行管理。如果这个对象树是在栈上的变量创建的,就可能会存在一些提前释放的问题。

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

//    QLabel *label = new QLabel(this); // 创建Label对象
//    label->setText("Hello World"); // 设置控件中,要显示的文本文件

    QLabel label(this);
    label.setText("hello world");
}

无法显示出来hello world。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

托管服务器常见的问题有哪些(常见托管问题解决)

​  对于我们来说,选择一个合适的服务器托管提供商只是建立和管理自己所属网站的第一步。相对来说,真正的挑战在于解决管理网站运行时可能出现的各种问题。就像有时,有些常见的服务器托管问题是不可避免的,但通过主动监控、定期…

统信操作系统安装Docker

1操作系统信息 2 当前系统预装了Docker相关文件,因此以下两个步骤无需操作: 1.安装环境 yum install -y yum-utils 2.设置镜像仓库 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 仓库地址默认是国外的&…

Matlab|基于目标级联法的微网群多主体分布式优化调度

目录 主要内容 1.1 上层微网群模型 1.2 下层微网模型 部分程序 实现效果 下载链接 主要内容 本文复现《基于目标级联法的微网群多主体分布式优化调度》文献的目标级联部分, 建立微网群系统的两级递阶优化调度模型: 上层是微网群能量调度中心优化调度…

python爬虫(3)

上一次的代码结果如下: 当然会有一点点不一样是正常的表现,因为这个图本身使用随机数rand函数做的,用其他两种随机函数出来的结果也不会完全相同。 继上节这次带来的是数组的重塑和转置 1、一维数组的重塑 在NumPy模块中的reshape()函数可…

黑马点评-附近商户实现

GEO数据结构 Redis在3.2版本中加入了对GEO的支持,允许存储地理坐标信息,根据经纬度来检索数据。 GEO本质上是基于sortedSet实现的,在Sorted Set中,每个成员都是与一个分数(score)相关联的,这个分数用于对成员进行排序…

LeetCode-102.题: 二叉树的层序遍历(原创)

【题目描述】 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]] 【题目链接…

如何将任何文本转换为概念图(GC)

原文地址:how-to-convert-any-text-into-a-graph-of-concepts 使用 Mistral 7B 将任何文本语料库转换为知识图的方法 2023 年 11 月 10 日 使用递归 RAG 方法来实现具有多跳推理的 QnA,以回答基于大型文本语料库的复杂查询。 知识图增强生成与递归 R…

goby的安装和使用

简介 Goby是一款基于网络空间测绘技术的新一代网络安全工具,它通过给目标网络建立完整的资产知识库,进行网络安全事件应急与漏洞应急。 Goby可提供最全面的资产识别,目前预置了超过10万种规则识别引擎,能够针对硬件设备和软件业…

深入探索Docker数据卷:实现容器持久化存储的完美方案(下)

🐇明明跟你说过:个人主页 🏅个人专栏:《Docker入门到精通》 《k8s入门到实战》🏅 🔖行路有良友,便是天堂🔖 目录 四、Docker数据卷的高级管理 1、数据卷的生命周期管理 2、数据…

2001-2022年上市公司利润表数据

2001-2022年上市公司利润表数据 1、时间:2001.12.31-2022.12.31 2、范围:上市公司 3、指标:证券代码、证券简称、统计截止日期、报表类型、投资收益、其中:对联营企业和合营企业的投资收益、公允价值变动收益、营业利润、其他综…

网关数据采集解决方案-天拓四方

随着物联网技术的快速发展,数据采集已成为企业运营、管理和决策的重要支撑。网关作为连接不同网络的关键设备,其在数据采集过程中发挥着至关重要的作用。本文将详细介绍一种网关数据采集解决方案,旨在确保数据采集的高效性、准确性和安全性。…

「解析文件流,Java之FileOutputStream助您轻松操作文件!」

🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!&#xf…

【Java项目介绍和界面搭建】拼图小游戏——作弊码、查看完整图片

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏 …

HarmonyOS 数据持久化 关系型数据库之 初始化操作

上文 HarmonyOS 数据持久化之首选项 preferences 我们有说用户首选项 但它只能处理一些比较简单的数据类型结构 的持久化处理 如果是一些批量较大 结构较为复杂的数据结构 那么 首选项就无法满足了 我们就要选择 关系型数据库 通过 SQLite 组件实现的一种本地数据库&#xff0…

TCP包头

TCP包头: 1.序号:发送端发送数据包的编号 2.确认号:已经确认接收到的数据的编号(只有当ACK为1时,确认号才有用) TCP为什么安全可靠: 1.在通信前建立三次握手连接 SYN SYNACK ACK SYN是TCP包头的一个字段 tcp.port 端口号 抓包数据 2.在通信过程中通过序…

JavaWeb笔记 --- 一JDBC

一、JDBC JDBC就是Java操作关系型数据库的一种API DriverManager 注册驱动可以不写 Class.forName("com.mysql.jdbc.Driver"); Connection Statement ResultSet PrepareStatement 密码输入一个SQL脚本,直接登录 预编译开启在url中 数据库连接池

指针进阶(下)指针实操

sizeof 和 strlen 首先我们来复习一下sizeof 和 strlen 的区别。 sizeof 是操作符&#xff0c;只关注内存中存放的数据的大小&#xff0c;并不会参与sizeof 括号内部的计算。注意它的单位是字节 #include <stdio.h>int main() {int a 10;printf("%d\n", size…

USB2.0设备检测过程信号分析

1.简介 USB设备接入的Hub端口负责检测USB2.0设备是否存在和确定USB2.0设备的速度。检测设备是否存在和确定设备速度涉及一系列的信号交互&#xff0c;下面将分析该过程。 2.硬件 USB低速设备和全速/高速设备的连接器在硬件结构上有所不同&#xff0c;而主机或者Hub接收端连接…

redis中的zset的原理

一、zset有序集合的原理 如果有序集合元素个数少于128个且元素值小于64字节&#xff0c;使用压缩列表&#xff08;新版本已经废弃压缩列表改用listpack数据结构了&#xff09; 如果不满足上述条件&#xff0c;采用跳表作为redis的底层数据结构 二、压缩列表 1.由连续内存块组…

一张照片一键换脸:无需数据集和训练 | 开源日报 No.186

s0md3v/roop Stars: 23.6k License: AGPL-3.0 roop 是一个一键换脸的项目。 该项目可以通过一张目标人物的照片&#xff0c;实现对视频中人脸进行替换&#xff0c;无需数据集和训练。其主要功能、关键特性和核心优势包括&#xff1a; 可以在计算机上运行&#xff0c;并支持 C…