news 2026/7/26 17:19:00

Qt 入门实战(二):HelloWorld 的两种方式与控件内存管理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Qt 入门实战(二):HelloWorld 的两种方式与控件内存管理

Qt 学起来挺有意思的,但初学者往往会被一些细节绕晕。
在上一篇博客里,我们讲了 Qt 的环境搭建和基础概念,这篇我们直接来动手做一个最简单的HelloWorld,顺便把控件的生命周期、堆栈分配、QString 这些关键点顺便梳理一下。


一、HelloWorld 的两种实现方式

在 Qt 中,实现 HelloWorld,其实就是在窗口上显示一段文本。
有两种方式:

  1. 图形化方式:使用 Qt Designer(拖控件、设置属性)
  2. 纯代码方式:直接写 C++ 代码创建控件

两种方式最终效果一样,底层都是创建控件对象,只不过 Designer 帮你自动生成了代码而已。


二、方式一:Qt Designer(可视化方式)

1. 打开 UI 设计界面

双击widget.ui,Qt Creator 会进入Qt Designer 模式,看到的是可视化窗口,而不是代码。


2. 拖拽 Label 控件显示 HelloWorld

  • 在左侧控件栏找到Label
  • 拖动到设计窗口
  • 拖拽控件边缘或右下角的小方块,可以改变大小
  • 在右侧属性编辑器中,把text属性改为"Hello World"

这样,界面就完成了。


3. Qt Designer 的对象树

右上角有一个对象树(Object Inspector),显示当前界面所有控件的层级关系:

  • 顶层是窗口(Widget)
  • 子节点是 Label 或按钮
  • 层级关系 = 运行时的父子关系

也就是说 Designer 里看到的结构,运行时会一模一样。


4. 拖拽控件背后的机制

拖控件后,.ui文件会新增一段 XML 代码,每个控件都有<widget>标签,记录控件类型、大小、位置等。

编译时,qmake 会调用 uic 工具,把.ui文件生成对应的ui_widget.hC++ 代码。
运行时,这些代码帮我们构建界面,完全自动化。


5. ui_widget.h 中的真实代码

打开ui_widget.h可以看到类似:

label=newQLabel(Widget);label->setObjectName(QString::fromUtf8("label"));label->setGeometry(QRect(220,120,171,91));
  • new QLabel(Widget)→ 创建控件并指定父对象
  • setObjectName→ 给控件命名,用于查找或样式匹配
  • setGeometry→ 控件位置和大小

这说明:

Qt Designer 并不是魔法,它只是帮你写了这些 C++ 代码。


三、方式二:纯代码方式

1. 构造函数中创建控件

纯代码方式通常把控件创建写在Widget 的构造函数里:

QLabel*label=newQLabel(this);label->setText("Hello World");

原因很简单:

  • 构造函数执行时,窗口对象已经存在
  • 可以安全使用this作为父对象
  • 控件会被挂到对象树上,生命周期由 Qt 管理

不放在构造函数里,会很难保证控件能正常显示。


2. setText 的 QString

label->setText("Hello World");
  • setText接收QString类型
  • QString 是 Qt 自己的字符串类,支持 Unicode
  • 可以直接传 C 风格字符串(隐式转换)

当初 Qt 诞生时,C++ 还没标准库,使用起来并不方便,为了更好的开发,Qt 自己造了这一套轮子:QString、QList、QVector、QMap……
即便现在标准库成熟,在开发中可以使用标准库类型,但这些类依然存在,因为他们与 Qt 的框架有着深度绑定,不可能删去。而且这些类型也是蛮好用的,例如QString内部对字符串编码进行了处理。

在 Qt 原生 API 中,优先使用 Qt 类型,比如 QString,比 std::string 更好用。


3. 控件默认显示在左上角

如果没有手动设置位置或使用布局管理器:

QLabel*label=newQLabel(this);
  • 控件会默认出现在(0,0)左上角
  • 可以用move()setGeometry()指定位置
  • 或者使用布局管理器(推荐):
QVBoxLayout*layout=newQVBoxLayout(this);layout->addWidget(label);

布局管理器会自动处理位置和大小,响应窗口缩放。


4. 为什么控件要放在堆上

QLabel*label=newQLabel(this);
  • 如果写成栈对象:
QLabellabel(this);
  • 构造函数结束后,控件就被销毁了
  • 窗口显示时控件已经不存在

堆对象 + parent 指定,可以保证控件在父窗口生命周期内一直存在。

栈对象仅适合临时控件或数据对象,GUI 控件不适合。


5. 为什么没有 delete 也不会内存泄漏

很多人会疑惑:

QLabel*label=newQLabel(this);

没有 delete,会不会泄漏?

  • 不会
  • 因为我们把 label 挂到了对象树
  • 父窗口析构时,Qt 会自动释放所有子对象
  • 对象树管理生命周期,是 Qt 内存管理的重要机制

四、小结

  • Qt Designer:拖控件、属性编辑,背后生成 XML → C++ 代码
  • 纯代码方式:手动 new 控件,设置 text、几何、布局
  • 控件内存管理:父对象 + 对象树 → 自动释放
  • QString:Qt 自己的字符串类,跨平台、Unicode 支持
  • 堆 vs 栈:控件必须堆分配,否则生命周期过短

这就是一个最小可运行的 Qt HelloWorld背后的完整逻辑。
两种方式最终效果一样,只是你选择用 Designer 还是纯代码,看你习惯和场景。

↖(ω)↗↖(ω)↗↖(ω)↗

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/26 6:43:31

SSM线上学习系统8e88w(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面

系统程序文件列表系统项目功能&#xff1a;学院,课程,教师,学生,课程信息,学习记录SSM线上学习系统开题报告一、课题背景与意义1.1 课题背景在“互联网教育”政策推动下&#xff0c;线上学习已成为教育模式的重要组成部分。然而当前部分线上学习工具存在功能单一、数据割裂等问…

作者头像 李华
网站建设 2026/7/21 9:38:49

深度解析:MindsDB与ChromaDB向量数据库集成的高效实战指南

深度解析&#xff1a;MindsDB与ChromaDB向量数据库集成的高效实战指南 【免费下载链接】mindsdb mindsdb/mindsdb: 是一个基于 SQLite 数据库的分布式数据库管理系统&#xff0c;它支持多种数据存储方式&#xff0c;包括 SQL 和 NoSQL。适合用于构建分布式数据库管理系统&#…

作者头像 李华
网站建设 2026/7/20 20:35:06

32、深入了解Samba与Linux安全策略

深入了解Samba与Linux安全策略 在当今复杂的网络环境中,无论是实现不同操作系统间的资源共享,还是保障系统的安全性,都是至关重要的任务。Samba作为实现Linux与Windows系统资源共享的关键工具,以及Linux系统安全策略的制定与实施,对于系统的稳定运行和数据安全起着举足轻…

作者头像 李华
网站建设 2026/7/23 19:25:03

26、调试 Shell 程序的实用方法

调试 Shell 程序的实用方法 在编程过程中,调试是不可或缺的环节。对于使用 bash 进行 UNIX 编程的开发者来说,虽然 bash 具备丰富的特性和控制结构,但缺乏像 C 和 C++ 那样强大且集成的编程支持工具。不过,bash 自身也提供了一些实用的调试功能,下面将详细介绍。 基本调…

作者头像 李华
网站建设 2026/7/25 17:20:32

Symbolic 英文单词学习

1️、基本信息单词&#xff1a;symbolic词性&#xff1a;形容词发音&#xff1a; &#x1f1fa;&#x1f1f8; /sɪmˈbɑː.lɪk/&#x1f1ec;&#x1f1e7; /sɪmˈbɒl.ɪk/词源&#xff1a; 来自希腊语 symbolikos&#xff08;象征的、符号的&#xff09;&#xff0c;由 s…

作者头像 李华
网站建设 2026/7/26 1:31:30

AI开发全流程工具链:从编码辅助到模型部署的实战指南

在AI开发的浪潮中&#xff0c;工具链已成为效率与质量的决定性因素。本文将系统拆解现代AI开发全流程&#xff0c;涵盖智能编码、数据处理、模型训练、评估部署五大环节&#xff0c;通过5个核心工具、12段实战代码、8个mermaid流程图、15个Prompt示例和6组对比图表&#xff0c;…

作者头像 李华