Qt基础入门-详解
前言
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中得接口也非常得好读,用起来简单



相关文章:
Qt基础入门-详解
前言 qt之路正式开启 💓 个人主页:普通young man-CSDN博客 ⏩ 文章专栏:C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见📝 🎉欢迎大家点赞ὄ…...
FPGA开发,使用Deepseek V3还是R1(3):系统级与RTL级
以下都是Deepseek生成的答案 FPGA开发,使用Deepseek V3还是R1(1):应用场景 FPGA开发,使用Deepseek V3还是R1(2):V3和R1的区别 FPGA开发,使用Deepseek V3还是R1&#x…...
移动端国际化翻译同步解决方案-V3
1.前言 因为软件出海,从在上上家公司就开始做翻译系统,到目前为止已经出了两个比较大的版本了,各个版本解决的痛点如下: V1版本: 主要针对的是AndroidiOS翻译不一致和翻译内容管理麻烦的问题,通过这个工具…...
多空狙击线-新指标-图文教程,多空分界买点以及强弱操盘技术教程,通达信炒股软件指标
“多空狙击线”指标 “多空狙击线”特色指标是量能型技术指标,主要用于分析股票市场中机构做多/做空力量的强程度。该指标的构成、定义与原理如下: “多空狙击线”指标,又称机构做多/做空能量线,通过计算和分析股票市场中机构做多/做空力量…...
零信任架构和传统网络安全模式的
零信任到底是一个什么类型的模型?什么类型的思想或思路,它是如何实现的,我们要做零信任,需要考虑哪些问题? 零信任最早是约翰金德瓦格提出的安全模型。早期这个模型也是因为在安全研究上考虑的一个新的信任式模型。他最…...
Oracle 11g的部署配置
1、进入官网下载所需版本的Oracle 2、安装 ①:选择setup.exe开始安装 ②:安装提示如下,直接忽略,选是 ③:配置安全更新 填写邮箱,并取消勾选 ④:如果点击下一步,提示什么代理啥的…...
下载b站视频音频
文章目录 方案一:jjdown如何使用 方案二:bilibili哔哩哔哩下载助手如何使用进入插件网站插件下载插件安装 使用插件下载视频音频:复制音频下载地址 方案三:bat命令下载单个音频下载单个视频下载单个音视频 方案一:jjdo…...
记录spring-boot 3.X版本整合RocketMq
版本信息 先把该次整合的版本信息列如下: spring-boot spring-cloud rocketmq-spring-boot-starter rocketmq-client rocketmq 3.0.13 2022.0.5 2.2.3 4.9.8 4.9.8 版本信息是如何选择的呢?看rocketMq官网springcloud alibaba版本声明 rock…...
《基于HarmonyOS NEXT API 12+,搭建新闻创作智能写作引擎》
在信息爆炸的时代,新闻行业对于内容生产的效率和质量有着极高的要求。AI技术的发展为新闻创作带来了新的变革契机,借助AI智能写作助手,新闻工作者可以快速生成新闻稿件的初稿,大大提高创作效率。本文将基于HarmonyOS NEXT API 12及…...
探秘基带算法:从原理到5G时代的通信变革【六】CRC 校验
文章目录 2.5 CRC 校验2.5.1 前言2.5.2 CRC算法简介2.5.3 CRC计算的详细过程2.5.4 CRC校验的两种方法详解**分离比较法****整体运算法****不同位出错与余数的关系****总结** 2.5.5 CRC计算的C实现及工具介绍**C实现CRC计算****CRC计算工具推荐** **2.5.6 总结:CRC校…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_conf_add_dump
ngx_conf_add_dump 定义在src\core\ngx_conf_file.c static ngx_int_t ngx_conf_add_dump(ngx_conf_t *cf, ngx_str_t *filename) {off_t size;u_char *p;uint32_t hash;ngx_buf_t *buf;ngx_str_node_t *sn;ngx_conf_dump_t *cd;has…...
MySQL快速搭建主从复制
一、基于位点的主从复制部署流程 确定主库Binlog是否开启修改主从server_id主库导出数据从库导入数据确定主库备份时的位点在从库配置主库信息查看复制状态并测试数据是否同步 二、准备阶段(主库和从库配置都需要修改) 1、确定主库Binlog是否开启 2、修改主从se…...
Linux注册进程终止处理函数
atexit() 是一个标准库函数,用于注册在进程正常终止时要调用的函数。通过 atexit(),你可以确保在程序结束时自动执行一些清理工作,比如释放资源、保存状态等。 函数原型如下: #include <stdlib.h> int atexit(void (*func…...
pytorch 模型测试
在使用 PyTorch 进行模型测试时,一般包含加载测试数据、加载训练好的模型、进行推理以及评估模型性能等步骤。以下为你详细介绍每个步骤及对应的代码示例。 1. 导入必要的库 import torch import torch.nn as nn import torchvision import torchvision.transforms as trans…...
水仙花数(华为OD)
题目描述 所谓水仙花数,是指一个n位的正整数,其各位数字的n次方和等于该数本身。 例如153是水仙花数,153是一个3位数,并且153 13 53 33。 输入描述 第一行输入一个整数n,表示一个n位的正整数。n在3到7之间&#x…...
(十二)基于 Vue 3 和 Mapbox GL 实现的坐标拾取器组件示例
下面是一个基于 Vue 3 和 Mapbox GL 实现的坐标拾取器组件示例: <template><div class="map-container"><div ref="mapContainer" class="map"></div><div class="coordinates-box"><div v-if=&qu…...
【华为OD机试真题29.9¥】(E卷,100分) - IPv4地址转换成整数(Java Python JS C++ C )
题目描述 存在一种虚拟IPv4地址,由4小节组成,每节的范围为0~255,以#号间隔,虚拟IPv4地址可以转换为一个32位的整数,例如: 128#0#255#255,转换为32位整数的结果为2147549183(0x8000FFFF) 1#0#0#0,转换为32位整数的结果为16777216(0x01000000) 现以字符串形式给出一…...
《白帽子讲 Web 安全》之深入同源策略(万字详解)
目录 引言 一、同源策略基础认知 (一)定义 (二)作用 (三)作用机制详解 二、同源策略的分类 (一)域名同源策略 (二)协议同源策略 (三&…...
USRP4120-通用软件无线电平台
1、产品描述 USRP4120平台是彬鸿科技公司推出的以XILINX XC7Z020 SOC处理器为核心,搭配ADI AD9361射频集成芯片,针对无线通信系统科研与教学实验场景的一款通用软件无线电平台。产品频率范围70MHz~6GHz,模拟带宽200KHz~56MHz,支持…...
计算机毕业设计SpringBoot+Vue.js社区智慧养老监护管理平台(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
yoloV5的学习-pycharm版本
真的很让人气愤的一点,老师把我的pycharm给卸载了,我那个上面不仅有gpu-torch,还有gpu-torch,他给俺删了,删了很久,我心都碎了,过几天我就去找他负责,让他给我装回来我的环境&#x…...
蓝桥杯 之 图形规律
文章目录 分析组成,找到规律数正方形 在蓝桥杯中,常常会有一些图形的规律的题目需要我们去解决,所以我们需要学会其中的一些方法,我们这样才能解决对应的问题 方法1:直接对n进行拆分方法2:使用递归的思路&a…...
JavaScript 变量语法扩展
随着ECMAScript 6(ES6)及后续版本的发布,JavaScript引入了许多新的特性,极大地丰富了变量声明和使用的语法。这些改进不仅提升了代码的可读性和简洁性,还增强了开发效率。本文将介绍一些重要的变量语法扩展,…...
SslConnection::SslConnection()详解
一、🔍 SslConnection::SslConnection() 详解 这个构造函数的主要作用是: 创建 SSL 对象创建 BIO(I/O 缓冲区)初始化 SSL 服务器模式绑定回调函数(onRead() 处理接收数据) 📌 1. 初始化 SSL 相…...
【计算机网络入门】初学计算机网络(八)
目录 1. S-W协议的信道利用率 2. GBN、SR协议的信道利用率 3.术语补充 3.1 滑动窗口协议 3.2 ARQ协议、连续ARQ协议 4. 信道划分介质访问控制 4.1 时分复用(TDM) 4.2 统计时分复用(STDM) 4.3 频分复用(FDM&a…...
迷你世界脚本生物接口:Creature
生物接口:Creature 彼得兔 更新时间: 2024-05-22 17:51:22 继承自 Actor 具体函数名及描述如下: 序号 函数名 函数描述 1 getAttr(...) 生物属性获取 2 setAttr(...) 生物属性设置 3 isAdult(...) 判断该生物是否成年 4 setOxygenNeed(…...
vue 和 react 底层采用的 diff 算法的区别
Vue 3 和 React 在底层 Diff 算法上的实现确实有一些区别,主要体现在设计理念、性能优化策略以及具体实现方式上。以下是对两者 Diff 算法差异的详细分析: 1. 总体设计理念 Vue 3 的 Diff 算法 Vue 3 的虚拟 DOM Diff 算法基于“双端比较”思想ÿ…...
VUE集成Live2d
VUE集成Live2d 目前基于大模型,可以实现一个桌面的3D动画小人,个人猜测可以简介这个项目进行实现 1-参考网址 试了很多项目,只有这个项目直观的把问题说清楚了 Live2D Vue3技术应用:https://blog.csdn.net/hh1233321/article/details/1406947…...
C++蓝桥杯基础篇(七)
片头 嗨~小伙伴们,大家好!今天我们来一起学习蓝桥杯基础篇(七),学习相关字符串的知识,准备好了吗?咱们开始咯! 一、字符与整数的联系——ASCII码 每个常用字符都对应一个-128~127的…...
常见的非关系性数据库
非关系型数据库(NoSQL)有多种类型,每种类型针对不同的应用场景提供了不同的存储和查询方式。以下是一些常见的非关系型数据库及其特点: 1. 键值数据库(Key-Value Stores) 特点:数据以键值对的…...




