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。

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

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

相关文章

【java基础】异常处理机制

目录 1、异常体系介绍 1.1、异常是什么? 1.2、运行时异常和编译时异常的区别? 2、异常的用法 2.1、捕获异常 2.2、异常中的常见方法 2.3、抛出异常 2.4、自定义异常 1、异常体系介绍 1.1、异常是什么? java异常是指在程序运行时可能出现的一些错误,如&am…

责任链模式(Chain of Responsibility Pattern)

责任链模式 说明 责任链模式(Chain of Responsibility Pattern)属于行为型模式,它是指使多个对象都有机会处理请求,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。从而避免请求…

IntelliJ IDEA自定义关闭当前文件的快捷方式

前言 idea中关闭当前标签页的默认快捷键是CtrlF4,这个组合键在键盘上操作起来很是不方便,我们可以在设置中自定义自己习惯的快捷方式。 自定义步骤 要在 IntelliJ IDEA 中将关闭当前文件的快捷方式设置为 Alt Q,请按照以下步骤操作:打开 …

github Commits must have verified signatures

1.首先确认是否有权限,如有权限的情况下那就是配置有问题了 我的情况是,能拉取代码,提交的时候出现这种情况:Commits must have verified signatures 这里是生成证书,如果已经生成过的,就不用生成了 ssh…

ARM/Linux嵌入式面经(一):海康威视

海康威视 1.函数指针和指针函数区别 1.定义的差异 函数指针:函数指针的定义涉及到函数的地址。例如,定义一个指向函数的指针 int (*fp)(int),这里 fp 是一个指针,它指向一个接受一个整数参数并返回整数的函数。 指针函数&#…

《C缺陷和陷阱》-笔记(2)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 文章目录 前言 一、理解函数声明 1.(*(void(*)( ))0)( ); 2.signal 函数接受两个参数: 3.使用typedef 简化函数声明: 二、运算符的优先级…

【项目】Boost 搜索引擎

文章目录 1.背景2.宏观原理3.相关技术与开发环境4. 实现原理1.下载2.加载与解析文件2.1获取指定目录下的所有网页文件2.2. 获取网页文件中的关键信息2.3. 对读取文件进行保存 3.索引3.1正排与倒排3.2获取正排和倒排索引3.3建立索引3.3.1正排索引3.3.2倒排索引 4.搜索4.1 初始化…

UNIAPP微信小程序中使用Base64编解码原理分析和算法实现

为何要加上UNIAPP及微信小程序,可能是想让检索的翻围更广把。😇 Base64的JS原生编解码在uni的JS引擎中并不能直接使用,因此需要手写一个原生的Base64编解码器。正好项目中遇到此问题,需要通过URLLink进行小程序跳转并携带Base64参…

Linux第73步_学习Linux设备树和“OF函数”

掌握设备树是 Linux驱动开发人员必备的技能! 1、了解设备树文件 在3.x版本以前的Linux内核源码中,存在大量的“arc/arm/mach-xxx”和“arc/arm/plat-xxx”文件夹,里面很多个“.c”和“.h”文件,它们用来描述设备信息。而现在的A…

MySQL实战:SQL优化及问题排查

有更合适的索引不走,怎么办? MySQL在选取索引时,会参考索引的基数,基数是MySQL估算的,反映这个字段有多少种取值,估算的策略为选取几个页算出取值的平均值,再乘以页数,即为基数 查…

FPGA高端项目:FPGA基于GS2971的SDI视频接收+GTX 8b/10b编解码SFP光口传输,提供2套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收转HDMI输出应用本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收HLS图像缩放Video Mixer多路视频拼接应用本方案的SDI接收OSD动态字符叠加…

【ARM Trace32(劳特巴赫) 高级篇 21 -- SystemTrace ITM 使用介绍】

文章目录 SystemTrace ITMSystemTrace ITM 常用命令Trace Data AnalysisSystemTrace ITM CoreSight ITM (Instrumentation Trace Macrocell) provides the following information: Address, data value and instruction address for selected data cyclesInterrupt event info…

Maven基础简介

作者简介: zoro-1,目前大二,正在学习Java,数据结构,spring等 作者主页: zoro-1的主页 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 Maven简介 Maven是什么 Maven…

Qt5.14.2揭秘Qt与SSL/TLS的完美邂逅:打造坚不可摧的网络安全防线

引言: 在数字化时代,数据安全是每个开发者和用户都不可忽视的问题。Qt,作为一个强大的跨平台开发框架,为我们提供了丰富的网络功能,其中就包括了对SSL/TLS加密通信的支持。本文将带你深入了解如何在Qt中实现SSL证书认证…

JVM的工作流程

目录 1.JVM 简介 2.JVM 执行流程 3. JVM 运行时数据区 3.1 堆(线程共享) 3.3 本地方法栈(线程私有) 3.4 程序计数器(线程私有) 3.5 方法区(线程共享) 4.JVM 类加载 ① 类…

软件测试的就业前景如何?

近年来,进入软件测试的就业人数逐渐增加。现在的社会对软件测试这个职业都有很大的需求。也有很多刚步入社会的年轻人想学习软件测试。那么你知道学习软件测试的的发展前景怎么样吗?看看下面的详细介绍。 关于软件测试行业发展前景问题,是很多准备入行…

c++ 常用的STL

前言 写这篇博客目的是为了记录在刷算法题中使用过的STL,因为有些不太常用的会遗忘。这篇博客只是作为笔记,不是详细的STL,因此只会对常用方法说明,不会详细介绍。此外在后面用到新的STL内容时会再补充。 列队 基础列队 基本列…

【python】time库知识整理

简介 python的time库是python内置库,主要负责处理与时间相关的事务。 获取当前时间 函数作用time()获取当前时间戳ctime()获取字符串形式的时间gmtime()调用内部方法,赋予属性,能够被程序调用执行 time返回的是时间戳 ctime是返回的我们…

MPU6050详解

文章目录 前言MPU6050简介MPU6050参数 硬件电路MPU6050框图电荷泵的原理 内部时钟生成需要使用的寄存器(常用)采样率划分器配置寄存器陀螺仪配置寄存器加速度计配置寄存器加速度计测量寄存器温度测量寄存器陀螺仪测量寄存器电源管理1寄存器电源管理2寄存…

Tomcat实现java博客项目、状态页及常见配置介绍

目录 一、自建博客 1. 项目背景 2. 操作示例 二、状态页 1. 概述 2. server status 信息状态页 3. manager app 项目管理状态页 4. host manger 虚拟主机管理状态页 三、常见配置 1. 端口8005/tcp安全配置管理 2. tomcat端口号 3. 虚拟主机设置 4. Context配置 一…