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

        可视化操作实现

        纯代码方式

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

利用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中得接口也非常得好读,用起来简单


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

React Native从入门到进阶详解

React Native知识框架从入门到进阶的问题。首先需要结合我搜索到的资料来整理出结构化的内容。证据中有多本书籍和文章&#xff0c;可能会涉及不同的章节和重点&#xff0c;需要仔细梳理。 首先&#xff0c;根据邱鹏源的《React Native精解与实战》将知识分为入门和进阶两大部分…

win本地vscode通过代理远程链接linux服务器

时间&#xff1a;2025.2.28 1. win本地下载nmap.exe nmap官网 https://nmap.org/或者 https://nmap.org/download#windows下载win版本并安装。 2. vscode插件Remote-SSH 插件下载Remote-SSH 3. 配置 按照图中顺序配置ssh 1.点击左侧工具栏的“小电视”图标 2.点击ssh的…

MIT 6.S184 流匹配与扩散模型公开课

课程简介 MIT 2025年开设的关于流匹配算法与扩散模型的新课&#xff0c;6.S184: Generative AI with Stochastic Differential Equations&#xff08;生成式人工智能与随机微分方程&#xff09;&#xff0c;授课教师是Peter Holderrieth和Ezrah Erives。 生成式AI是一种能创建…

SQL server配置ODBC数据源(本地和服务器)

本地配置 1. 控制面板中找到系统ODBC数据源&#xff08;打开控制面板直接搜&#xff09; 2. 选择“系统DSN”&#xff0c;点击“添加” 3. 选择“SQL server” 4. 名称和描述自己填&#xff0c;服务器选择本机设备名称 5. 选择ID和密码验证&#xff0c;并填写本地SQL server登…

JVM线程分析详解

java线程状态&#xff1a; 初始(NEW)&#xff1a;新创建了一个线程对象&#xff0c;但还没有调用start()方法。运行(RUNNABLE)&#xff1a;Java线程中将就绪&#xff08;ready&#xff09;和运行中&#xff08;running&#xff09;两种状态笼统的称为“运行”。 线程对象创建…

Redis - 高可用实现方案解析:主从复制与哨兵监控

文章目录 Pre概述Redis 高可用实现方案一、主从复制机制1.1 全量同步流程1.2 增量同步&#xff08;PSYNC&#xff09;流程 二、哨兵监控机制2.1 故障转移时序流程 三、方案对比与选型建议四、生产环境实践建议 Pre Redis-入门到精通 Redis进阶系列 Redis进阶 - Redis主从工作…

栈和队列的模拟实现

文章目录 一. 回顾栈和队列二. stack的模拟实现stack.hstack.cpp 三. queue的模拟实现queue.htest.cpp 四. 了解dequeuevector和list都有各自的缺陷deque 总结 一. 回顾栈和队列 回顾一下栈和队列 栈&#xff1a;stack&#xff1a;后进先出 _ 队列&#xff1a;queue&#xf…

【Linux】之【Bug】VMware 虚拟机开机 一直卡在黑屏左上角下划线闪烁界面

解决 参考&#xff1a; 解决Ubuntu20.04 开机黑屏光标闪烁进不去系统 Centos根目录100%解决思路 当前界面 ctrlaltf3-f6 暂时进入终端界面 df -h 查看发现根目录 磁盘空间已满 执行命令 查看当前目录占用内存明细 sudo du -h -x --max-depth1清理无用的大内存文件 或者安装…

【uniapp】离线打包uniapp为apk详细步骤

先看效果 登录页面的图片由于来自于图鸟官网&#xff0c;这里没有显示。 离线打包uniapp为apk 运行环境&#xff1a;华为mate30&#xff0c;已经升级为鸿蒙系统。 参考文档 https://blog.csdn.net/xiaoyao_studio/article/details/144076431 https://juejin.cn/post/739…

【通俗讲解电子电路】——从零开始理解生活中的电路(一)

导言&#xff1a;电子电路为什么重要&#xff1f; ——看不见的“魔法”&#xff0c;如何驱动你的生活&#xff1f; 清晨&#xff0c;当你的手机闹钟响起时&#xff0c;你可能不会想到&#xff0c;是电子电路在精准控制着时间的跳动&#xff1b;当你用微波炉加热早餐时&#…

Octave3D 关卡设计插件

课程参考链接 这位大佬有在视频合集中有详细的讲解&#xff0c;个人体验过&#xff0c;感觉功能很强大 https://www.bilibili.com/video/BV1Kq4y1C72P/?share_sourcecopy_web&vd_source0a41d8122353e3e841ae0a39908c2181 Prefab资源管理 第一步 在场景中创建一个空物体…

通过多线程分别获取高分辨率和低分辨率的H264码流

目录 一.RV1126 VI采集摄像头数据并同时获取高分辨率码流和低分辨率码流流程 ​编辑 1.1初始化VI模块&#xff1a; 1.2初始化RGA模块&#xff1a; 1.3初始化高分辨率VENC编码器、 低分辨率VENC编码器&#xff1a; 1.4 VI绑定高分辨率VENC编码器&#xff0c;VI绑定RGA模块…

【Python 数据结构 1.零基础复习】

目录 一、输入与输出 1.输入 2.格式化输出 二、数字与变量 1.字符串 & 整型 2.字符串 & 整型 & 浮点型 3.变量 练习 2235. 两整数相加 三、运算与操作 1.四则运算 练习 2769. 找出最大的可达成数字 3.取整与取余 练习 2651. 计算列车到站时间 ​编辑 四、真与假 1…

21. 构造二叉树(卡码网)

21. 构造二叉树 find&#xff08;&#xff09;方法 在Python中&#xff0c;str.find(sub[, start[, end]]) 方法用于查找子字符串 sub 在字符串中首次出现的位置&#xff0c;返回其起始索引。如果未找到&#xff0c;返回 -1 class Tree:def __init__(self,valNone,leftNone,r…

RocketMQ定时/延时消息实现机制

RocketMQ 的延迟消息是其核心特性之一&#xff0c;允许消息在指定延迟时间后才被消费者消费。 定时消息生命周期 一、延迟消息的核心机制 RocketMQ&#xff08;5.0之前&#xff09; 不支持任意时间精度的延迟&#xff0c;而是通过预定义的 延迟级别&#xff08;Delay Level&a…

【编程题】7-3 树的同构

7-3 树的同构 1 题目原文2 思路解析3 代码实现4 总结 1 题目原文 题目链接&#xff1a;7-3 树的同构 给定两棵树 T 1 T_1 T1​ 和 T 2 T_2 T2​​。如果 T 1 T_1 T1​ 可以通过若干次左右孩子互换就变成 T 2 T_2 T2​&#xff0c;则我们称两棵树是“同构”的。例如图 1 1 …

WebP2P技术在嵌入式设备中的应用:EasyRTC音视频通话SDK如何实现高效通信?

在数字化时代&#xff0c;实时通信技术&#xff08;RTC&#xff09;与人工智能&#xff08;AI&#xff09;的融合正在重塑各个行业的交互方式。从在线教育到远程医疗&#xff0c;从社交娱乐到企业协作&#xff0c;RTC的应用场景不断拓展。然而&#xff0c;传统的RTC解决方案往往…

【前端】前端设计中的响应式设计详解

文章目录 前言一、响应式设计的定义与作用二、响应式设计的原则三、响应式设计的实现四、响应式设计的最佳实践总结 前言 在当今数字化时代&#xff0c;网站和应用程序需要适应各种设备&#xff0c;从桌面电脑到平板电脑和手机。响应式设计应运而生&#xff0c;成为一种可以适…

【AVRCP】探寻AVRCP控制互操作性:连接、命令与设备交互

AVRCP对于实现设备间的高效音频/视频控制至关重要。而控制互操作性要求作为AVRCP的核心部分&#xff0c;详细规定了设备在连接建立、命令传输等方面的具体操作。确保了不同设备之间能够实现无缝的远程控制。 一、AVCTP连接管理 1.1 AVCTP连接建立 发起者&#xff1a;AVCTP控制…

LLM大型语言模型(一)

1. 什么是 LLM&#xff1f; LLM&#xff08;大型语言模型&#xff09;是一种神经网络&#xff0c;专门用于理解、生成并对人类文本作出响应。这些模型是深度神经网络&#xff0c;通常训练于海量文本数据上&#xff0c;有时甚至覆盖了整个互联网的公开文本。 LLM 中的 “大” …