Qt基础入门-详解

news2025/3/5 2:05:31

 前言
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控件打印

        可视化操作实现

        纯代码方式

下面我对这个代码进行一个详细的读:​编辑

利用push_button来实现helloworld

         可视化操作实现

        纯代码方式

项目文件解析

.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 发布时提供商业许可和开源许可,开发者可按需选择

优点

  1. 跨平台特性显著,能适配几乎所有主流平台。
  2. 接口设计简洁,易于上手,并且对学习其他框架具有借鉴意义。
  3. 简化了内存回收机制,开发效率高,可快速构建应用程序。
  4. 社区活跃,市场份额稳步上升,同时还支持嵌入式开发

发展前景

随着物联网、自动驾驶、游戏开发等行业的蓬勃发展,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 新建项目+创建文件+界面介绍

新建项目对话框里有五类项目模板:

ApplicationQt 应用程序,涵盖普通窗体程序和 QtQuick 程序
Library能够创建动态库、静态库,以及 QtQuick 扩展插件、QtCreator 自身插件
其他项目可创建单元测试项目、Qt4 设计师自定义控件、子目录项目等
Non-Qt-Project非 Qt 项目,可创建纯 C 或纯 C++ 项目
Import Project导入项目,用于从版本控制系统管理的软件项目中导入旧的项目

常用的只有第⼀类 Application,选择它,在右侧会看到 Qt应⽤程序的五个子模板:

Qt Widgets Application普通窗体模板,属于传统基于部件的窗体界面程序
Qt Console ApplicationQt 控制台应用程序,由于 Qt 主要用于图形界面设计,该控制台项目模板基本不使用
Qt for Python在 Python 下以 LGPL 的许可来开发闭源 Qt 软件
Qt Quick ApplicationQt 提供的一种高级用户界面技术,便于快速为移动以及嵌入式设备开发流畅美观的用户界面。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();  // 进入应用程序的主事件循环
}
  1. 包含必要的头文件

    • #include "widget.h":引入自定义的小部件类声明。
    • #include <QApplication>:引入 Qt 的 QApplication 类,用于管理应用程序的全局设置和事件循环。
  2. main 函数

    • int main(int argc, char *argv[]):这是 C++ 程序的入口函数,argc 和 argv 分别是命令行参数的数量和值列表。
  3. 创建 QApplication 对象

    • QApplication a(argc, argv);:创建一个 QApplication 对象,它管理应用程序的资源和事件循环。每个 Qt 应用程序必须且只能有一个 QApplication 实例。
  4. 创建并显示自定义小部件

    • Widget w;:创建自定义的小部件对象(假设你的小部件类名为 Widget)。
    • w.show();:调用 show() 方法显示小部件。如果没有这一步,小部件不会出现在屏幕上。
  5. 进入事件循环

    • 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("按钮被点击了!"));
}
  1. 包含必要的头文件

    • #include "widget.h":引入自定义小部件类的声明。
    • #include <QMessageBox>:如果需要使用 Qt 提供的消息框,需引入相应的头文件。
  2. 构造函数实现

    • Widget::Widget(QWidget *parent):构造函数的实现,接受一个可选的父对象指针,默认为 nullptr
    • ui(new Ui::Widget):初始化 ui 成员变量,指向由 Qt Designer 自动生成的 UI 类实例。
    • ui->setupUi(this):调用 setupUi() 方法来设置 UI 组件,确保设计好的界面能够在程序运行时正确显示。
  3. 析构函数实现

    • Widget::~Widget():析构函数的实现,用于释放资源。
    • delete ui:释放 ui 成员变量所占用的内存。
  4. 信号与槽的连接

    • 使用 connect() 函数将信号与槽进行连接。例如,将按钮点击信号 QPushButton::clicked 与槽函数 on_pushButton_clicked 进行连接。
    • 示例中的槽函数会在按钮点击时弹出一个信息框。
  5. 槽函数实现

    • void Widget::on_pushButton_clicked():槽函数的实现,具体处理按钮点击事件。
    • QMessageBox::information():显示一个信息框,通知用户按钮已被点击。


widget.ui

这个我就不做过多解释,只是解释一下htmlxml:

XML 与 HTML 的主要区别

特性XMLHTML
用途存储和传输数据创建和展示网页内容
标签用户自定义标签固定的预定义标签
语法严格性必须正确闭合标签,遵循严格的语法规则标签不闭合也可以正常显示,语法规则较宽松
显示导向不直接涉及内容的显示直接控制内容的布局和显示
错误处理对错误敏感,解析器遇到错误会停止解析浏览器通常会尝试纠正错误并继续解析
数据模型树状结构,适合表示复杂的数据关系线性结构,主要用于文本和多媒体内容展示
  • 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中得接口也非常得好读,用起来简单


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

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

相关文章

FPGA开发,使用Deepseek V3还是R1(3):系统级与RTL级

以下都是Deepseek生成的答案 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;1&#xff09;&#xff1a;应用场景 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;2&#xff09;&#xff1a;V3和R1的区别 FPGA开发&#xff0c;使用Deepseek V3还是R1&#x…

移动端国际化翻译同步解决方案-V3

1.前言 因为软件出海&#xff0c;从在上上家公司就开始做翻译系统&#xff0c;到目前为止已经出了两个比较大的版本了&#xff0c;各个版本解决的痛点如下&#xff1a; V1版本&#xff1a; 主要针对的是AndroidiOS翻译不一致和翻译内容管理麻烦的问题&#xff0c;通过这个工具…

多空狙击线-新指标-图文教程,多空分界买点以及强弱操盘技术教程,通达信炒股软件指标

“多空狙击线”指标 “多空狙击线”特色指标是量能型技术指标&#xff0c;主要用于分析股票市场中机构做多/做空力量的强程度。该指标的构成、定义与原理如下: “多空狙击线”指标&#xff0c;又称机构做多/做空能量线&#xff0c;通过计算和分析股票市场中机构做多/做空力量…

零信任架构和传统网络安全模式的

零信任到底是一个什么类型的模型&#xff1f;什么类型的思想或思路&#xff0c;它是如何实现的&#xff0c;我们要做零信任&#xff0c;需要考虑哪些问题&#xff1f; 零信任最早是约翰金德瓦格提出的安全模型。早期这个模型也是因为在安全研究上考虑的一个新的信任式模型。他最…

Oracle 11g的部署配置

1、进入官网下载所需版本的Oracle 2、安装 ①&#xff1a;选择setup.exe开始安装 ②&#xff1a;安装提示如下&#xff0c;直接忽略&#xff0c;选是 ③&#xff1a;配置安全更新 填写邮箱&#xff0c;并取消勾选 ④&#xff1a;如果点击下一步&#xff0c;提示什么代理啥的…

下载b站视频音频

文章目录 方案一&#xff1a;jjdown如何使用 方案二&#xff1a;bilibili哔哩哔哩下载助手如何使用进入插件网站插件下载插件安装 使用插件下载视频音频&#xff1a;复制音频下载地址 方案三&#xff1a;bat命令下载单个音频下载单个视频下载单个音视频 方案一&#xff1a;jjdo…

记录spring-boot 3.X版本整合RocketMq

版本信息 先把该次整合的版本信息列如下&#xff1a; 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 版本信息是如何选择的呢&#xff1f;看rocketMq官网springcloud alibaba版本声明 rock…

探秘基带算法:从原理到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 总结&#xff1a;CRC校…

水仙花数(华为OD)

题目描述 所谓水仙花数&#xff0c;是指一个n位的正整数&#xff0c;其各位数字的n次方和等于该数本身。 例如153是水仙花数&#xff0c;153是一个3位数&#xff0c;并且153 13 53 33。 输入描述 第一行输入一个整数n&#xff0c;表示一个n位的正整数。n在3到7之间&#x…

《白帽子讲 Web 安全》之深入同源策略(万字详解)

目录 引言 一、同源策略基础认知 &#xff08;一&#xff09;定义 &#xff08;二&#xff09;作用 &#xff08;三&#xff09;作用机制详解 二、同源策略的分类 &#xff08;一&#xff09;域名同源策略 &#xff08;二&#xff09;协议同源策略 &#xff08;三&…

USRP4120-通用软件无线电平台

1、产品描述 USRP4120平台是彬鸿科技公司推出的以XILINX XC7Z020 SOC处理器为核心&#xff0c;搭配ADI AD9361射频集成芯片&#xff0c;针对无线通信系统科研与教学实验场景的一款通用软件无线电平台。产品频率范围70MHz~6GHz&#xff0c;模拟带宽200KHz~56MHz&#xff0c;支持…

计算机毕业设计SpringBoot+Vue.js社区智慧养老监护管理平台(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

yoloV5的学习-pycharm版本

真的很让人气愤的一点&#xff0c;老师把我的pycharm给卸载了&#xff0c;我那个上面不仅有gpu-torch&#xff0c;还有gpu-torch&#xff0c;他给俺删了&#xff0c;删了很久&#xff0c;我心都碎了&#xff0c;过几天我就去找他负责&#xff0c;让他给我装回来我的环境&#x…

蓝桥杯 之 图形规律

文章目录 分析组成&#xff0c;找到规律数正方形 在蓝桥杯中&#xff0c;常常会有一些图形的规律的题目需要我们去解决&#xff0c;所以我们需要学会其中的一些方法&#xff0c;我们这样才能解决对应的问题 方法1&#xff1a;直接对n进行拆分方法2&#xff1a;使用递归的思路&a…

【计算机网络入门】初学计算机网络(八)

目录 1. S-W协议的信道利用率 2. GBN、SR协议的信道利用率 3.术语补充 3.1 滑动窗口协议 3.2 ARQ协议、连续ARQ协议 4. 信道划分介质访问控制 4.1 时分复用&#xff08;TDM&#xff09; 4.2 统计时分复用&#xff08;STDM&#xff09; 4.3 频分复用&#xff08;FDM&a…

VUE集成Live2d

VUE集成Live2d 目前基于大模型&#xff0c;可以实现一个桌面的3D动画小人&#xff0c;个人猜测可以简介这个项目进行实现 1-参考网址 试了很多项目&#xff0c;只有这个项目直观的把问题说清楚了 Live2D Vue3技术应用:https://blog.csdn.net/hh1233321/article/details/1406947…

C++蓝桥杯基础篇(七)

片头 嗨~小伙伴们&#xff0c;大家好&#xff01;今天我们来一起学习蓝桥杯基础篇&#xff08;七&#xff09;&#xff0c;学习相关字符串的知识&#xff0c;准备好了吗&#xff1f;咱们开始咯&#xff01; 一、字符与整数的联系——ASCII码 每个常用字符都对应一个-128~127的…

el-input实现金额输入

需求&#xff1a;想要实现一个输入金额的el-input&#xff0c;限制只能输入数字和一个小数点。失焦数字转千分位&#xff0c;聚焦转为数字&#xff0c;超过最大值&#xff0c;红字提示 效果图 失焦 聚焦 报错效果 // 组件limitDialog <template><el-dialog:visible.s…

双碳战略下的智慧能源实践:安科瑞储能管理系统助力企业绿色转型

在全球碳中和目标加速推进的背景下&#xff0c;中国“十四五”规划明确提出构建以新能源为主体的新型电力系统&#xff0c;储能技术成为支撑能源结构转型的核心要素。安科瑞储能能量管理系统作为企业级智慧能源解决方案的核心载体&#xff0c;凭借其技术创新与场景适配能力&…

《鸢尾花数学大系:从加减乘除到机器学习》开源资源

《鸢尾花数学大系&#xff1a;从加减乘除到机器学习》开源资源 Gitee&#xff1a;https://gitee.com/higkoo/ bilibili&#xff1a;https://space.bilibili.com/513194466 GitHub&#xff1a;https://github.com/Visualize-ML