前言
qt之路正式开启💓 个人主页:普通young man-CSDN博客
⏩ 文章专栏:C++_普通young man的博客-CSDN博客
⏩ 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com
若有问题 评论区见📝
🎉欢迎大家点赞👍收藏⭐文章
————————————————
目录
Qt 框架详解
Qt 是什么
发展历程
支持平台与版本
优点
发展前景
成果
搭建 Qt 开发环境
开发工具介绍
Qt SDK 下载与安装
安装SDK
环境变量配置
为什么要设置环境变量
环境变量是什么
以 path 环境变量为例
设置 Qt 环境变量的目的
深入了解 Qt Creator
界面概览
Qt Creator 新建项目+创建文件+界面介绍
Qt HelloWorld程序
用label控件打印
可视化操作实现
纯代码方式
下面我对这个代码进行一个详细的读:编辑
可视化操作实现
纯代码方式
项目文件解析
.pro 文件的作用
widget.h 文件的作用
main.cpp 文件的作用
widget.cpp 文件的作用
widget.ui
XML 与 HTML 的主要区别
Qt Creator 快捷键表
查阅文档
对象树
编辑
1. QObject 的对象树
2. QWidget 的继承关系
3. 内存管理的优势
代码举例
字符编码解析:避免乱码
坐标
Qt 框架详解
Qt 是什么
Qt 是跨平台的 C++ 图形用户界面应用程序框架,为开发者提供构建优质图形界面的全套功能。它完全面向对象,易于扩展,支持组件式开发模式,开发者既能通过拖拽组合快速搭建应用,也能用 C++ 进行深度开发。图形用户界面作为人与计算机交互的关键接口,在各类设备中至关重要,而 Qt 正是打造这些界面的得力工具12。
发展历程
Qt 的发展历程丰富多样,1991 年由奇趣科技创立,1996 年进入商业领域,成为 Linux 桌面环境 KDE 的基石。此后,历经诺基亚、Digia 公司收购,不断演进。2014 年,Qt Creator 3.1.0 和 Qt 5.3 正式版发布,标志着 Qt 全面支持 iOS、Android 等多平台,功能更加完善
支持平台与版本
Qt 支持的平台广泛,涵盖 Windows、Unix/X11、Macintosh、Embedded 以及 Android 等。目前最新版本是 Qt 6,但考虑到企业中大量项目仍在使用 Qt 5,且两者核心功能差异不大,学习时选用 Qt 5 更具实用性。Qt 发布时提供商业许可和开源许可,开发者可按需选择
优点
- 跨平台特性显著,能适配几乎所有主流平台。
- 接口设计简洁,易于上手,并且对学习其他框架具有借鉴意义。
- 简化了内存回收机制,开发效率高,可快速构建应用程序。
- 社区活跃,市场份额稳步上升,同时还支持嵌入式开发。
发展前景
随着物联网、自动驾驶、游戏开发等行业的蓬勃发展,Qt 的重要性日益凸显。在物联网和嵌入式系统中,Qt 可开发带 GUI 的嵌入式应用,用于智能家居、汽车、医疗设备等领域;自动驾驶和智能交通领域,Qt 能开发车载嵌入式系统和用户界面程序;游戏开发方面,Qt 的 Qt 3D Studio 等功能模块大有用武之地。从就业角度看,Qt 开发人员需求持续增长,就业机会多、薪资可观、职业发展前景良好
成果
Linux桌面环境KDE
WPS Office
Google Earth
VLC 播放器
VirtualBox虚拟机软件(VirtualBox号称是最强的免费虚拟机软件)
搭建 Qt 开发环境
开发工具介绍
Qt 开发工具多样,常用的有 Qt Creator、Visual Studio 和 Eclipse。Qt Creator 专为 Qt 开发设计,是轻量级跨平台集成开发环境(IDE),集成了可视化界面设计器、代码编辑器、调试工具等,功能强大且易用,后续学习将以它为主。Visual Studio 由微软开发,可开发多种类型应用,支持多种编程语言,功能丰富。Eclipse 是跨平台自由 IDE,最初用于 Java 开发,通过插件也能用于 Qt 开发
Qt SDK 下载与安装
Qt SDK 可从官方网站(Index of /archive/qt)或国内清华源(Index of /qt/archive/qt/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror )下载。以 5.14 版本为例,下载时需按步骤选择版本、操作系统对应的安装文件。安装过程中,要注意断网安装可跳过注册登录步骤;安装路径不能含中文;根据磁盘空间选择安装组件,若空间充足建议全选。安装完成后,可通过运行示例程序验证安装是否成功
安装SDK
环境变量配置
配置 Qt 环境变量是为了在命令行或其他应用中能直接访问 Qt 相关命令和工具。找到 Qt 安装路径下的 “bin” 目录,将其添加到系统环境变量中。具体操作是在 “此电脑” 右键选择 “属性”,进入 “高级系统设置” 的 “环境变量” 进行添加。
为什么要设置环境变量
环境变量是什么
环境变量就像是城市里一些特殊的索引标记。在计算机这个 “城市” 里,应用程序运行的时候常常需要一些特定的信息,这些信息就放在环境变量里。好比店铺可能需要知道附近仓库的位置,这个位置信息就可以看作是环境变量里的内容。
以 path 环境变量为例
就拿 Windows 和 DOS 系统里的 path 环境变量来说吧。当你要在这个 “城市” 里找一家特定的 “店铺”(也就是运行一个程序),但又没告诉计算机具体位置(没给完整路径)时,计算机不会只在你当前站的地方(当前目录)找,它还会去 path 这个 “地图索引” 里标记的地方找。比如说,path 里标记了好几个街区,计算机就会去这些街区挨个找你要的 “店铺”。
设置 Qt 环境变量的目的
在 Windows 系统上设置 Qt 的环境变量,就相当于在城市的 “地图索引” 里专门标记出 Qt 相关 “店铺”(命令和工具)的位置。这样一来,不管你是在街道上(命令行)溜达,还是在其他大楼(其他应用程序)里,都能快速找到这些 Qt 的 “店铺”,直接去使用里面的东西,不用每次都费劲去记具体位置再去找啦。
深入了解 Qt Creator
界面概览
类别 详情 菜单栏 1. 文件:新建、打开、关闭项目和文件、打印、退出等基本功能
2. 编辑:撤销、剪切、复制、查找、选择编码等功能
3. 构建:构建和运行项目等相关功能
4. 调试:调试运行项目等相关功能
5. Analyze:QML 分析器、Valgrind 内存和功能分析器等相关功能
6. 工具:快速定位菜单、外部工具菜单等,包含环境、文本编辑器、帮助、构建和运行、调试器、版本控制等设置选项
7. 控件:设置窗口布局的菜单,如全屏显示、隐藏边栏功能等
8. 帮助:Qt 帮助、Qt Creator 版本信息、报告 bug、插件管理等菜单模式选择 1. 欢迎模式:功能快捷入口(打开帮助教程、示例程序、项目,新建项目,快速打开以前项目和会话,联网查看 Qt 官方论坛和博客等),示例页面有大量示例程序及搜索栏,教程页面有英文视频教程资源
2. 编辑模式:查看和编辑程序代码、管理项目文件,编辑器有关键字特殊颜色显示、代码自动补全、声明定义快捷切换、函数原型提示、F1 键快速打开相关帮助、全项目查找等功能,可在 “工具→选项” 设置编辑器
3. 设计模式:整合 Qt Designer 功能,可设计图形界面,进行部件属性、信号和槽、布局设置等操作
4. 调试模式:支持设置断点、单步调试、远程调试等功能,有局部变量和监视器、断点、线程、快照等查看窗口
5. 项目模式:包含特定项目的构建设置(项目版本、Qt 版本、编译步骤)、运行设置、编辑器设置(文件默认编码)、代码风格设置、依赖关系等页面
6. 帮助模式:整合 Qt 助手,有目录、索引、查找、书签等导航模式,可查看 Qt 和 Qt Creator 各方面信息构建套件选择器 1. 目标选择器:选择构建项目、使用的 Qt 库,适用于多个 Qt 库的项目,可选择编译项目的 debug 或 release 版本
2. 运行按钮:实现项目的构建和运行
3. 调试按钮:实现项目的调试
4. 构建按钮:完成项目的构建欢迎模式下的窗口工作方式 1. Project:新建工程、打开工程
2. 示例:Qt 官方的一些示例
3. 教程:Qt 官方教程定位器 快速定位项目、文件、类、方法、帮助文档、文件系统,可使用过滤器准确定位查找结果 输出窗格 1. 问题:显示程序编译时的错误和警告信息(快捷键 Alt+1)
2. Search Results:显示执行搜索操作后的结果信息(快捷键 Alt+2)
3. 应用程序输出:显示应用程序运行过程中输出的所有信息(快捷键 Alt+3)
4. 编译输出:显示程序编译过程输出的相关信息(快捷键 Alt+4)
5. Debugger Console:调试器控制台相关输出(快捷键 Alt+5)
6. 概要信息:显示相关概要内容(快捷键 Alt+6)
7. 测试结果(Test Results):展示测试结果信息(快捷键 Alt+7)会话记录 可对会话进行管理(包括 Clone),未打开工程时显示最后一次打开的(会话)工程,已打开则显示当前的会话(工程) 新建项目 可进行项目的新建操作 打开已有项目 用于打开已存在的项目
Qt Creator 新建项目+创建文件+界面介绍
新建项目对话框里有五类项目模板:
Application | Qt 应用程序,涵盖普通窗体程序和 QtQuick 程序 |
Library | 能够创建动态库、静态库,以及 QtQuick 扩展插件、QtCreator 自身插件 |
其他项目 | 可创建单元测试项目、Qt4 设计师自定义控件、子目录项目等 |
Non-Qt-Project | 非 Qt 项目,可创建纯 C 或纯 C++ 项目 |
Import Project | 导入项目,用于从版本控制系统管理的软件项目中导入旧的项目 |
常用的只有第⼀类 Application,选择它,在右侧会看到 Qt应⽤程序的五个子模板:
Qt Widgets Application | 普通窗体模板,属于传统基于部件的窗体界面程序 |
Qt Console Application | Qt 控制台应用程序,由于 Qt 主要用于图形界面设计,该控制台项目模板基本不使用 |
Qt for Python | 在 Python 下以 LGPL 的许可来开发闭源 Qt 软件 |
Qt Quick Application | Qt 提供的一种高级用户界面技术,便于快速为移动以及嵌入式设备开发流畅美观的用户界面。Qt Quick 模块是开发 QML 应用的标准库,涵盖可视化、交互、动画、模型、视图、粒子效果以及着色效果等创建用户界面所需的一切 |
后续操作:
构建工具 简介 特点 相关文件 / 系统 与 Qt 关系 qmake 是一个构建工具,用于自动生成 makefile 文件 支持跨平台构建 编辑后缀名为.pro 的文件 Qt 自带的构建工具 CMake 是一个跨平台的构建工具,本身不是编译器,是生成让编译器能读懂编译流程文件的工具 能自动生成构建系统,如 Makefile 和 Visual Studio 项目文件 生成相关构建系统文件 第三方工具,有自己的文档 Qbs(Qt Build Suite:Qt 构建套件) 同 qmake、CMake 一样是构建工具 号称是新一代的构建工具,比 qmake 编译速度更快,从项目文件的高级项目描述中生成正确的依赖表 无特定文件类型描述,生成依赖表 没有绑定 Qt 版本,可独立使用
基类 说明 QMainWindow 主窗口类,用于复杂应用程序,包含中央客户区、菜单栏、工具栏、状态栏及多个可停靠工具对话框 QWidget 最基础的窗体类,可放置多个控件实现功能,适合简单界面程序 QDialog 基于对话框的程序,支持模态显示和返回值,常用于弹窗或主界面(继承自 QWidget) ![]()
选择的语言是"汉语","英语"这样的语言.而不是"编程语⾔"
默认情况下,系统仅提供第一个 “Desktop Qt 5.14.2 MinGW 64-bit” 选项。若用户安装并配置了多个 Qt 套件,在相应操作中则可将所有套件纳入选择范围。
Qt 套件是一套完整的集合,涵盖了 Qt 程序从编译链接直至运行环境所需的全部工具,以及 Qt 类库。以 MinGW 版本的 Qt 程序为例,在生成与调试过程中,至少需要以下组件:MinGW 中的编译器 g++(其会自动调用链接器)、与 g++ 相配套的基础库、调试器 gdb,还有利用 MinGW 环境编译而成的 Qt 类库本身。通常建议在 “Kit Selection” 中,将所有可用套件全部选中,以确保程序开发与运行的全面支持。
序号 窗口名称 详情 ① 组件选择窗口 分为多个组,如 Layouts、Buttons、Display Widgets 等,可找到界面设计的常见组件 ② UI 设计窗口 从组件选择窗口拖放组件到该窗口的窗体上,实现组件放置 ③ 动作编辑窗口 包含 Action Editor 和 Signals 及 Slots 编辑器。Action Editor 用于新建 Action 并添加到菜单栏和工具栏;Signals 和 Slots 编辑器用于可视化关联信号与槽 ④ 对象浏览窗口 以树状视图展示窗体上各组件的布局包含关系,视图有两列,分别显示组件的对象名称(ObjectName)和类名称 ⑤ 属性设置窗口 显示选中组件或窗体的各种属性及其取值,可在窗口中修改属性值
模式 说明 Debug 以 “-g” 模式编译,编译时带有符号信息,其优点是便于程序调试 Profile 处于 “Debug” 和 “Release” 之间的一种模式,兼顾性能和调试,可近似看作是性能更优且方便调试的版本 Release 经过优化处理,在性能方面相比 “Debug” 模式更上一个档次
Qt HelloWorld程序
用label控件打印
可视化操作实现
这个操作很简单:
这就是利用图形界面进行打印helloworld
纯代码方式
这里为什么不直接构造对象?而是要new一个,这是因为直接构造他是创建到栈中,而new是创建到堆中,QT建议用new一个对象的方式
其实这也与他们的生命周期不同,创建到栈上离开特定的作用域就销毁了,但是如果创建到堆中生命周期一直到程序结束析构或则delete,这也去确保了qt中信号槽机制一直保持有效
下面我对这个代码进行一个详细的读:

这边你输入QLabel的时候会出现两个文件,一个没有.h,一个有.h,这个qlabel.h是一个qt的一个上古文件,如果学习c++的都知道什么是向前兼容,后面c++98更新后到c++11,然后命名方式就变成不要.h后缀,其实也就是在上面封装了一层,但是这里的标准肯定和远古文件的文件是不一样的
setText的参数是QString,这是由于c++中的string不要用,而且经常被骂,然后又不进行优化,所以qt就专门自己搞了一个QString,和String的用法插不多,除了QString,还有很多容器,qt都自己弄了一套轮子
利用push_button来实现helloworld
可视化操作实现
对这个控件玩一些qt中的信号槽机制,这里我就不用图形化界面,来演示这个幸信号槽机制,直接上代码:
纯代码方式
纯代码方式直接通过new来创建对象
大家自己悟,我就不说太多了
项目文件解析
在Qt开发环境中,
.pro
文件扮演着非常重要的角色。它是项目文件(Project File),由qmake工具自动生成,主要用于生成Makefile文件。Makefile文件是编译系统用来编译和链接代码的脚本。下面是对.pro
文件的一些关键点进行整理:
.pro
文件的作用
- 配置项目:
.pro
文件包含了项目的配置信息,如源文件、头文件、资源文件的位置,以及需要包含的库和编译选项等。- 生成Makefile:通过解析
.pro
文件,qmake可以生成适用于不同平台的Makefile文件,从而简化了跨平台开发的复杂性。- 支持多种平台:由于
.pro
文件是与平台无关的,因此可以在不同的操作系统上使用相同的项目文件,只需要调整少量的配置即可。# 定义项目模板为应用程序 TEMPLATE = app# 指定源文件 SOURCES += main.cpp \otherfile.cpp# 指定头文件 HEADERS += otherfile.h# 添加资源文件 RESOURCES += application.qrc# 设置额外的包含路径 INCLUDEPATH += /path/to/include# 链接外部库 LIBS += -L/path/to/lib -llibname# 设置编译器标志 QMAKE_CXXFLAGS += -Wall -O2
比如那刚才的helloworld举例:
widget.h
文件的作用
- 类声明:定义了一个继承自
QWidget
或其子类的自定义类。- 信号与槽机制:通过
Q_OBJECT
宏启用信号与槽机制,支持事件处理。- UI 组件访问:使用
Ui::Widget
命名空间中的Widget
类来访问通过 Qt Designer 设计的界面组件。//防止重复包含头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget>// 引入生成的 UI 头文件 #include "ui_widget.h"class Widget : public QWidget {Q_OBJECT // 必须包含此宏以支持信号与槽机制public:explicit Widget(QWidget *parent = nullptr); // 构造函数~Widget(); // 析构函数private slots:// 这里可以声明槽函数,用于响应信号void on_pushButton_clicked(); // 示例槽函数private:Ui::Widget *ui; // 指向生成的 UI 类实例,用于访问界面上的组件 };#endif // WIDGET_H
部分 描述 防止重复包含 使用预处理器指令 #ifndef
,#define
, 和#endif
来防止头文件被多次包含,确保编译器不会重复处理相同的代码。包含必要的头文件 - #include <QWidget>
引入 Qt 的基础窗口部件类。 - #include "ui_widget.h"
引入由 Qt Designer 自动生成的 UI 头文件,其中包含了所有设计好的界面组件的声明。 Q_OBJECT 宏 在类声明中必须包含 Q_OBJECT
宏,以启用信号与槽机制。这个宏允许类使用signals
和slots
关键字,并且让 qmake 工具能够识别并生成必要的元对象代码。构造函数和析构函数 - explicit Widget(QWidget *parent = nullptr);
构造函数,接受一个可选的父对象指针,默认为 nullptr
。- ~Widget();
析构函数,用于释放资源。 私有槽函数 在 private slots:
部分声明槽函数,这些函数将响应特定的信号。例如,void on_pushButton_clicked();
是一个示例槽函数,它会在按钮点击时被调用。UI 组件访问指针 Ui::Widget *ui;
:这是一个指向由 Qt Designer 生成的Ui::Widget
类实例的指针。通过这个指针,你可以访问界面上的所有组件。例如,如果你有一个按钮pushButton
,可以通过ui->pushButton
来访问它。
main.cpp
文件的作用
- 应用程序初始化:创建一个
QApplication
对象,它是所有 Qt 应用程序的基础,负责管理事件循环、应用程序级别的设置等。- 主窗口或小部件的创建与显示:实例化并显示自定义的小部件(如
Widget
)。- 事件循环启动:调用
QApplication::exec()
启动应用程序的主事件循环,等待用户交互。#include "widget.h" // 包含自定义小部件的头文件 #include <QApplication> // 包含 QApplication 类的头文件int main(int argc, char *argv[]) {QApplication a(argc, argv); // 创建 QApplication 对象,argc 和 argv 是命令行参数Widget w; // 创建自定义小部件对象w.show(); // 显示小部件return a.exec(); // 进入应用程序的主事件循环 }
包含必要的头文件:
#include "widget.h"
:引入自定义的小部件类声明。#include <QApplication>
:引入 Qt 的QApplication
类,用于管理应用程序的全局设置和事件循环。
main
函数:
int main(int argc, char *argv[])
:这是 C++ 程序的入口函数,argc
和argv
分别是命令行参数的数量和值列表。创建
QApplication
对象:
QApplication a(argc, argv);
:创建一个QApplication
对象,它管理应用程序的资源和事件循环。每个 Qt 应用程序必须且只能有一个QApplication
实例。创建并显示自定义小部件:
Widget w;
:创建自定义的小部件对象(假设你的小部件类名为Widget
)。w.show();
:调用show()
方法显示小部件。如果没有这一步,小部件不会出现在屏幕上。进入事件循环:
return a.exec();
:调用QApplication::exec()
方法进入应用程序的主事件循环。这个方法会阻塞直到应用程序退出(例如,用户关闭了所有窗口)。返回值是应用程序的退出代码。
widget.cpp
文件的作用
- 实现类的成员函数:提供在头文件中声明的成员函数的具体实现。
- 设置 UI 组件:初始化用户界面组件,并将信号与槽进行连接。
- 处理业务逻辑:实现应用程序的核心功能,如响应用户交互、数据处理等。
#include "widget.h" #include <QMessageBox> // 如果需要使用消息框// 构造函数实现 Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); // 设置 UI 组件// 连接信号与槽connect(ui->pushButton, &QPushButton::clicked, this, &Widget::on_pushButton_clicked); }// 析构函数实现 Widget::~Widget() {delete ui; // 释放 UI 组件 }// 槽函数实现 void Widget::on_pushButton_clicked() {QMessageBox::information(this, tr("提示"), tr("按钮被点击了!")); }
包含必要的头文件:
#include "widget.h"
:引入自定义小部件类的声明。#include <QMessageBox>
:如果需要使用 Qt 提供的消息框,需引入相应的头文件。构造函数实现:
Widget::Widget(QWidget *parent)
:构造函数的实现,接受一个可选的父对象指针,默认为nullptr
。ui(new Ui::Widget)
:初始化ui
成员变量,指向由 Qt Designer 自动生成的 UI 类实例。ui->setupUi(this)
:调用setupUi()
方法来设置 UI 组件,确保设计好的界面能够在程序运行时正确显示。析构函数实现:
Widget::~Widget()
:析构函数的实现,用于释放资源。delete ui
:释放ui
成员变量所占用的内存。信号与槽的连接:
- 使用
connect()
函数将信号与槽进行连接。例如,将按钮点击信号QPushButton::clicked
与槽函数on_pushButton_clicked
进行连接。- 示例中的槽函数会在按钮点击时弹出一个信息框。
槽函数实现:
void Widget::on_pushButton_clicked()
:槽函数的实现,具体处理按钮点击事件。QMessageBox::information()
:显示一个信息框,通知用户按钮已被点击。
widget.ui
这个我就不做过多解释,只是解释一下html和xml:
XML 与 HTML 的主要区别
特性 XML HTML 用途 存储和传输数据 创建和展示网页内容 标签 用户自定义标签 固定的预定义标签 语法严格性 必须正确闭合标签,遵循严格的语法规则 标签不闭合也可以正常显示,语法规则较宽松 显示导向 不直接涉及内容的显示 直接控制内容的布局和显示 错误处理 对错误敏感,解析器遇到错误会停止解析 浏览器通常会尝试纠正错误并继续解析 数据模型 树状结构,适合表示复杂的数据关系 线性结构,主要用于文本和多媒体内容展示
- XML XML 是一种用于存储和传输数据的标记语言。它被设计成一种灵活的语言,允许用户定义自己的标签来描述数据结构。
- HTML 是一种用于创建网页的标准标记语言。它定义了网页的结构和内容,并通过浏览器呈现给用户。
最后给大家展示这些文件的一个关联图:
当我们创建一个对象控件,他会有一个objectname
这个name会纯在与一个.h文件中,也就是我们主程序的声明文件,在这个项目文件中的上一级别目录:
Qt Creator 快捷键表
功能 | 快捷键 | 描述 |
---|---|---|
注释/取消注释 | Ctrl + / | 快速注释或取消注释选中的代码行或当前行。 |
运行项目 | Ctrl + R | 编译并运行当前项目。 |
编译项目 | Ctrl + B | 仅编译当前项目,不运行。 |
字体缩放 | Ctrl + 鼠标滑轮 | 使用鼠标滑轮调整编辑器中的字体大小。 |
查找 | Ctrl + F | 在当前文件中查找指定的文本。 |
整行移动 | Ctrl + Shift + ↑/↓ | 向上或向下移动当前选中的行或光标所在的行。 |
帮助文档 | F1 | 显示当前光标所在位置的相关帮助文档。 |
自动对齐 | Ctrl + I | 自动格式化当前文件中的代码,使其符合代码风格规范。 |
切换头文件和源文件 | F4 | 在同名的 .h 和 .cpp 文件之间快速切换。 |
生成函数声明的定义 | Alt + Enter | 在头文件中声明函数后,使用此快捷键在对应的源文件中自动生成函数定义。 |
查阅文档
这里做一个提醒:
大家不要看中文文档,养成一个阅读英文文档的一个习惯,因为不是什么都会有教程的
对象树
对象树其实就是一颗N插树
1. QObject 的对象树
- parent 指针的作用
每个 QObject 对象在创建时可以指定一个父对象(parent 指针),该对象会自动添加到父对象的children()
列表中。- 内存管理
当父对象被析构时,其所有子对象也会被自动析构。这确保了子对象的生命周期与父对象绑定,避免内存泄漏。
- 示例:若按钮(Button)的父对象是对话框(Dialog),当对话框关闭时,按钮会自动销毁。
- 关键特性
- 父对象并非继承意义上的父类,而是对象树中的层级关系。
- 子对象可通过
parent()
方法访问父对象,父对象可通过children()
方法获取所有子对象。
2. QWidget 的继承关系
- QWidget 的特性
QWidget 是所有可见 UI 组件的基类,继承自 QObject,因此也继承了对象树机制。
- 子组件的显示:子组件会显示在父组件的坐标系统内,并被父组件的边界剪裁。
- 自动布局调整:当父组件大小变化时,子组件会根据布局规则自动调整位置和大小。
- 典型应用场景
- 对话框(QDialog)中的按钮(QPushButton)作为子组件,随对话框销毁而销毁。
- 工具栏(QToolBar)作为主窗口(QMainWindow)的子组件,删除工具栏时主窗口会自动更新布局。
3. 内存管理的优势
- 自动内存回收
- 父对象析构时,递归销毁所有子对象。
- 手动删除子对象时,会自动从父对象的
children()
列表中移除。- 避免重复删除
Qt 确保每个 QObject 对象仅被删除一次,由析构顺序保证。
核心概念 说明 parent 指针 定义对象树层级关系,父对象析构时自动销毁子对象,简化内存管理。 QObject 树 所有 QObject 对象通过 parent 指针形成树形结构,确保资源自动释放。 QWidget 继承 可视化组件继承 QObject 的对象树机制,实现 UI 组件的父子关系与布局管理。
代码举例
我们自己封装一个自己得类,用QLabel来构造,这样就可以看到他构造和销毁得过程
字符编码解析:避免乱码
- GBK:采用双字节编码,即每个字符用 2 个字节来表示,但对于 ASCII 码中的字符,仍然使用单字节表示,与 ASCII 码兼容。这样可以在处理英文等字符时保持高效性,同时又能支持大量的汉字等中文符号。
- UTF-8:是一种变长编码,它可以使用 1 到 4 个字节来表示一个字符。对于 ASCII 码中的字符,UTF-8 使用 1 个字节表示,与 ASCII 码完全兼容;对于常用的汉字等字符,一般使用 3 个字节表示;对于一些生僻字符或特殊符号,可能会使用 4 个字节
UTF-8这个可以在Linux中验证字节数:
编译后:
如果你出现了cout输出时候乱码,可能就是你用了GBK或则UTF-8,匹配得是GBK:UTF-8,UTF-8 :GBK,他们编码规则不同如果去匹配就会出错,这边可以通过项目目录去查看当前得文件得编码规则是什么
坐标
坐标体系:以左上⻆为原点(0,0),X向右增加,Y向下增加。
其实这个很简单得,只要你接触一点前端都知道,qt中得接口也非常得好读,用起来简单