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

news/2024/4/13 11:30:21/文章来源:https://blog.csdn.net/weixin_73888239/article/details/136569660

目录

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

二、通过代码方式,创建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。

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

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

相关文章

Mysql8的优化(DBA)

Mysql8的优化 1、Mysql的安装优化1.1 修改配置参数(命令行、配件文件)1.1.1 命令行修改配置参数1.1.2 参数持久化1.1.3 Mysql多实例启动,以及配置密码文件 1.2 查询表的相关参数,以及表空间管理 2、Mysql高级优化(SQL&…

CNC机加工引入复合机器人可以提高生产效率,降低成本

CNC加工企业在过去依赖大量的人工来完成生产线上的各项任务,包括CNC机床的上下料、物料搬运以及部分装配工作。然而,随着产能需求的不断增长和人工成本的持续上升,企业逐渐意识到自动化升级的重要性与迫切性。 面临的挑战与需求: …

【DUSt3R】2张图2秒钟3D重建

【DUSt3R】2张图2秒钟3D重建 1. DUSt3R是一种用于稠密和无约束立体三维重建的方法,其实现步骤如下:2. 实际运行效果3. 运行结果4. 自问自答4.1 为社么这里要是使用transform模型呢?4.2 CroCo(通过跨视图完成3D视觉任务的自我监督预训练的一个研究)在DUSt3R的作用是什么,为…

云计算项目十:ES集群安装|部署kibana

ES集群安装 部署ES集群,用于ELK日志分析平台的构建 es-0001 主机更改 /etc/hosts [rootes-0001 ~]# vim /etc/hosts 192.168.1.71 es-0001 192.168.1.72 es-0002 192.168.1.73 es-0003 192.168.1.74 kibana 192.168.1.75 logstash # 将最新的/etc/hosts配置文件更…

javaSE-----继承和多态

目录 一.初识继承: 1.1什么是继承,为什么需要继承: 1.2继承的概念与语法: 二.成员的访问: 2.1super关键字 2.2this和super的区别: 三.再谈初始化: 小结: 四.初识多态: 4.1多…

Visual Studio 2019重装vs2019打不开.netcore项目

无法打开项目文件。 .NET SDK 的版本 7.0.306 至少需要 MSBuild 的 17.4.0 版本。当前可用的 MSBuild 版本为 16.11.2.50704。请将在 global.json 中指定的 .NET SDK 更改为需要当前可用的 MSBuild 版本的旧版本。 无法打开项目文件。 .NET SDK 的版本 7.0.306 至少需要 MSBui…

go语言添加代理

LiteIDE 工具->管理 https://mirrors.aliyun.com/goproxy/或https://goproxy.cn,direct 命令行 go env -w GOPROXYhttps://goproxy.cn,direct

C.C语言分支和循环语句

文章目录 一. 什么是语句 二. 分支语句(选择结构) 2.1. if 语句 2.1.1. 语法结构 2.1.2. 悬空else 2.1.3. 书写形式的对比 2.1.4. 练习 2.2. switch 语句 3.2.1. 语法结构 3.2.2. 在switch语句中的 break 3.2.3. default子句 3.2.4. 练习 三…

Android 12.0 系统默认打开OEM解锁开关功能实现

1.前言 在12.0的系统rom定制化开发中,在9.0系统以后为了设备的安装,系统开始启用oem机制,所以在adb push文件就需要先oem解锁,然后才可以 进行相关操作,所以就需要默认打开oem解锁的开关,来方便oem解锁功能的实现 如图: 2.系统默认打开OEM解锁开关功能实现的核心类 pack…

找不到本地组策略编辑器解决办法

创建记事本写入以下命令 echo offpushd "%~dp0"dir /b %systemroot%\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >gp.txtdir /b %systemroot%\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientTools-…

MySQL 学习笔记(基础篇 Day3)

「写在前面」 本文为黑马程序员 MySQL 教程的学习笔记。本着自己学习、分享他人的态度,分享学习笔记,希望能对大家有所帮助。推荐先按顺序阅读往期内容: 1. MySQL 学习笔记(基础篇 Day1) 2. MySQL 学习笔记&#xff08…

阿里云游戏访问与下载加速解决方案

随着全球化的发展,越来越多的企业开始将业务扩展到海外市场。然而,海外市场的挑战也是显而易见的。例如在游戏企业进军海外市场的过程中,网络延迟是一个常见的问题。由于地理位置的限制,海外用户登录访问游戏和游玩时,…

尚硅谷JavaScript高级学习笔记

01 准备 JavaScript中函数是对象。我们后续描述构造函数的内存模型时,会将构造函数称为构造函数对象。 02 数据类型 typeof 运算符来查看值的类型,它返回的是类型的字符串值 会做数据转换 03 相关问题 04数据_变量_内存 05相关问题1 06相关问题2 …

苍穹外卖学习-----2024/03/08

1.新增菜品 工具类AliOssUtil .java Data AllArgsConstructor Slf4j public class AliOssUtil {private String endpoint;private String accessKeyId;private String accessKeySecret;private String bucketName;/*** 文件上传** param bytes* param objectName* return*/pub…

分享axios+MQTT简单封装示例

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在19…

【教程】Github环境配置新手指南(超详细)

写在前面: 如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持! 文章目录 一、Github初始设置(一)登入Github(二)新建仓库 二、本地Git配置&am…

c8t6,hal库,pwm输出

1.cubemx配置 设置分配系数:71; 自动重装在计数值:499; 72MHZ/(711) 1MHZ; 1MHZ即1秒计数1000000次; 即1毫秒计数1000次; 自动重装载计数值设置为499;即0.5ms一个周期&#xff…

vue 在线预览word

1 mammoth 先找的是mammoth这个插件yarn add mammoth,版本是1,7.0 参考网上的示例使用如下: import mammoth from "mammoth"; const vHtml ref("") const readExcelFromRemoteFile (url) >{var xhr new XMLHttpRequest();xhr.open("…

在IDEA使用HBase Java API连接

一、下载安装Maven并加载到IDEA中 官网地址:Maven – Download Apache Maven 将对应版本的压缩包下载到本地,并新建一个文件夹Localwarehouse,用来保存下载的依赖文件 配置maven的系统环境配置,将maven安装的bin目录地址写入path环境变量: …

Vue的HTML插入——v-html指令

有时我们希望将数据作为HTML代码插入到HTML模板中&#xff0c;而不是以纯文本的形式显示。在这种情况下&#xff0c;我们需要使用Vue.js的v-html指令&#xff1a; <template><div><p>纯文本: {{ rawText }}</p><p>属性: <span v-html"r…