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 若有问题 评论区见📝 🎉欢迎大家点赞ὄ…...
【前端】HTML 备忘清单(超级详细!)
文章目录 入门hello.html注释 Comment段落 ParagraphHTML 链接Image 标签文本格式标签标题Section Divisions内部框架HTML 中的 JavaScriptHTML 中的 CSS HTML5 标签页面标题导航HTML5 TagsHTML5 VideoHTML5 AudioHTML5 RubyHTML5 kdiHTML5 progressHTML5 mark HTML 表格Table …...
版图自动化连接算法开发 00004 ------ 给定一个点,添加一个中间点实现 Manhattan 方式连接两个给定的坐标点
版图自动化连接算法开发 00004 ------ 给定一个点,添加一个中间点实现 Manhattan 方式连接两个给定的坐标点 引言正文引言 必读文章 ------ 版图自动化连接算法开发 00001 ------ 直接连接两个给定的坐标点。 此处,我们对给定点的坐标进行一下限制,因为是只添加一个点,因…...
C# Enumerable类 之 数据筛选
总目录 前言 在 C# 中,System.Linq.Enumerable 类是 LINQ(Language Integrated Query)的核心组成部分,它提供了一系列静态方法,用于操作实现了 IEnumerable 接口的集合。通过这些方法,我们可以轻松地对集合…...

Grafana服务安装并启动
Grafana服务安装并启动 1、介绍2、下载Grafana3、解压缩文件4、启动Grafana服务5、增加数据源,填写Prometheus访问地址6、增加图表 1、介绍 Grafana是一个开源的可视化系统监控和警报工具包。 2、下载Grafana 介绍:Grafana是一个开源的可视化系统监控和警报工具包…...

蓝桥杯web第三天
展开扇子题目, #box:hover #item1 { transform:rotate(-60deg); } 当悬浮在父盒子,子元素旋转 webkit display: -webkit-box:将元素设置为弹性伸缩盒子模型。-webkit-box-orient: vertical:设置伸缩盒子的子元素排列方…...
C#开发——时间间隔类TimSpan
TimeSpan 是 C# 中的一个结构( struct ),用于表示时间间隔或持续时间。它位于 System 命名空间中,是处理时间相关操作时非常重要的工具,尤其是在计算两个日期或时间之间的差值、表示时间段或执行时间相关的运算…...

NModbus 连接到Modbus服务器(Modbus TCP)
1、在项目中通过NuGet添加NModbus,在界面中添加一个Button。 using NModbus.Device; using NModbus; using System.Net.Sockets; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Docu…...

蓝桥杯 之 图形规律
文章目录 分析组成,找到规律数正方形 在蓝桥杯中,常常会有一些图形的规律的题目需要我们去解决,所以我们需要学会其中的一些方法,我们这样才能解决对应的问题 方法1:直接对n进行拆分方法2:使用递归的思路&a…...
多线程学习之路
多线程的创建方式主要有以下几种: 1. 继承 Thread 类 通过继承 Thread 类并重写 run() 方法来创建线程。 class MyThread extends Thread {Overridepublic void run() {// 线程执行的任务System.out.println("Thread is running");} }public class Mai…...

英码科技携昇腾DeepSeek大模型一体机亮相第三届北京人工智能产业创新发展大会
2025年2月28日,第三届北京人工智能产业创新发展大会在国家会议中心隆重开幕。本届大会以"好用、易用、愿用——以突破性创新加速AI赋能千行百业”为主题,重点展示人工智能技术创新成果与产业化应用实践。作为昇腾生态的APN伙伴,英码科技…...
【AI】如何理解与应对AI中的敏感话题:详细分析与实用指南
引言 随着人工智能(AI)技术的不断发展,我们在与AI交互时,可能会遇到敏感话题的讨论限制。在许多情况下,AI系统为了避免触及社会、政治或文化敏感点,会对用户输入进行一定的筛选和过滤。那么,这…...

(十 三)趣学设计模式 之 模版方法模式!
目录 一、 啥是模板方法模式?二、 为什么要用模板方法模式?三、 模板方法模式的实现方式四、 模板方法模式的优缺点五、 模板方法模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式&a…...

20250225-代码笔记03-class CVRPModel AND other class
文章目录 前言一、class CVRPModel(nn.Module):__init__(self, **model_params)函数功能函数代码 二、class CVRPModel(nn.Module):pre_forward(self, reset_state)函数功能函数代码 三、class CVRPModel(nn.Module):forward(self, state)函数功能函数代码 四、def _get_encodi…...

【postman】postman找回接口数据
项目提测,一打开postman天塌了,所有接口都不见了。。。。conllection目录也看不见了,也导入不了同事给我发的json文件。 然后重新找同事要了一个安装包,覆盖安装了之后,在下面的目录里面找到了备份文件【C:\Users\yan…...

Milvus向量数据库部署
一、什么是Milvus Milvus 是一款开源的向量数据库,旨在帮助开发者轻松管理和检索大规模向量数据。它通过高效的索引技术,支持快速的相似度搜索,使得从海量数据中查找最接近的匹配变得简单而快捷。无论是构建推荐系统、进行图像识别还是分析自…...

显式 GC 的使用:留与去,如何选择?
目录 一、什么是显式 GC? (一) 垃圾回收的基本原理 (二)显式 GC 方法和行为 1. System.gc() 方法 2. 显式 GC 的行为 (三)显式 GC 的使用场景与风险 1. JVM 如何处理显式 GC 2. 显式 GC…...

探秘基带算法:从原理到5G时代的通信变革【二】Viterbi解码
文章目录 二、关键算法原理剖析2.1 Viterbi 解码2.1.1 卷积码与网格图基础**卷积码****网格图****生成多项式****理想情况下解码过程** 2.1.2 Viterbi 算法核心思想2.1.3 路径度量与状态转移机制2.1.4 算法流程与关键步骤详解2.1.5 译码算法举例与复杂度分析2.1.6 算法代码示例…...

从零实现高并发内存池
目录 一、项目介绍 二、什么是内存池? 1.池化技术 2.内存池 3.内存池解决的问题 三、malloc本身就是内存池 四、定长内存池 五、高并发内存池整体框架 六、thread cache 七、central cache 八、page cache 一、项目介绍 当前项目是实现一个高并发的内存池…...
3-7 WPS JS宏 工作表移动复制实例-2(多工作簿的多工作表合并)学习笔记
************************************************************************************************************** 点击进入 -我要自学网-国内领先的专业视频教程学习网站 *******************************************************************************************…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...

Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...

MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...

毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...