1. QT 整体架构概览
1.1 QT 发展历程与设计理念
QT 作为一个跨平台的 C++ 应用程序开发框架,其发展历程体现了从简单图形库到综合性开发平台的演进过程。QT 的设计理念核心是 "一次编写,到处运行"(Write Once, Run Everywhere),这一理念贯穿了其整个发展历程。
QT 的发展可以划分为几个重要阶段。在 QT 4(2005 年)时期,框架奠定了现代架构基础,引入了 QT Designer 可视化设计工具、Phonon 多媒体框架,并开始支持移动平台。QT 5(2012 年)进行了重大架构重构,将原本 "大而全" 的集成架构转变为模块化设计,引入了 QML 和 QT Quick 用于声明式 UI 开发,强化了 OpenGL 支持,并将 QT Widgets 分离为独立模块。
当前的 QT 6(2020 年发布)代表了框架的最新演进,基于 C++17 标准进行开发,进一步优化了模块结构,例如合并了 QT Core 与 QT Gui 的基础功能,引入了 QT Quick 3D 支持 3D 渲染,显著提升了性能与跨平台一致性。QT 6 的设计目标是解决 QT 5 时代积累的模块依赖复杂、跨平台适配成本高、多线程性能瓶颈等问题,通过将庞大的 QT Widgets、QT Gui 模块拆分为更细粒度的组件,如将原 QT Gui 中的图形渲染功能独立为 QT Shader Tools,将字体处理模块分离为 QT Font Database(4)。
QT 的设计理念还体现在其面向对象的架构设计上。QT 基于 C++ 扩展,引入了独特的元对象系统(Meta-Object System),支持信号与槽等动态特性。这种设计使得 QT 不仅是一个图形库,更是一个完整的应用程序开发框架,包含了数千个预定义类,覆盖 GUI、网络、数据库等各种应用场景。
1.2 核心架构分层与组件布局
QT 采用了高度模块化和层次化的架构设计,这种设计理念体现了关注点分离的原则,使得不同功能模块可以独立开发、测试和维护。QT 6 的架构可以清晰地划分为四个主要层次,形成了一个完整的技术栈:
应用层(Application Layer):这是最顶层,直接面向开发者和最终用户,包含了各种具体的应用程序和用户界面实现。应用层可以基于传统的 QT Widgets 开发,也可以使用现代的 QML 和 QT Quick 技术栈。
UI 框架层(QML/Widgets):这一层提供了两种主要的 UI 开发方式。传统的 QT Widgets 基于 QWidget 的 MVC 设计模式,提供了丰富的桌面控件;而 QML 架构则是基于声明式编程的现代 UI 框架,采用 JavaScript 集成,适合开发流畅、动态的界面,特别适合移动和嵌入式设备。
核心模块层(Qt Core) :这是整个 QT 框架的基础,包含了 QObject 类、信号槽机制、元对象系统(MOC)等基础架构,同时提供容器类、线程管理、文件 I/O 等基础服务。Qt Core 模块是所有其他 QT 模块的基础,提供了事件循环、对象模型、信号和槽、线程、文件 I/O、定时器等基本功能(45)。
平台抽象层(Platform Abstraction):最底层是平台抽象层,通过 QPA(Qt Platform Abstraction)实现跨平台支持,包含 Windows、Linux、macOS 等系统适配组件。这一层的设计使得 QT 能够在不同操作系统上提供一致的 API 接口,开发者无需为每个平台编写特定的代码。
在核心组件布局方面,QT 6 的基础模块包括以下几个核心组件:
- Qt Core:提供核心的非图形类,是其他模块使用的基础
- Qt D-Bus:通过 D-Bus 协议进行进程间通信的类
- Qt GUI:图形用户界面(GUI)组件的基础类
- Qt Network:使网络编程更简单、更可移植的类
- Qt Qml:QML 和 JavaScript 语言类
- Qt Quick:声明式框架,用于构建具有自定义用户界面的高动态应用程序
- Qt Quick Controls:轻量级 QML 类型,用于为桌面、嵌入式和移动设备创建性能良好的用户界面
- Qt Quick Dialogs:用于从 Qt Quick 应用程序创建系统对话框并与之交互的类型
- Qt Quick Layouts:用于在用户界面中安排基于 Qt Quick 2 的项目的布局项目
- Qt Quick Test:QML 应用程序的单元测试框架
- Qt Test:用于 Qt 应用程序和库单元测试的类
- Qt Widgets:用 C++ widget 扩展 Qt GUI 的类
1.3 架构设计的核心优势
QT 架构设计的核心优势主要体现在以下几个方面:
跨平台性:QT 通过抽象操作系统接口,实现了真正的 "一次编写,到处运行",有效避免了平台特定代码的编写。这种跨平台能力不仅体现在桌面操作系统上,还扩展到了移动平台(Android、iOS)和嵌入式设备,使得开发者可以使用相同的代码库构建跨平台应用。
面向对象设计:QT 基于 C++ 扩展,引入了强大的元对象系统,支持信号与槽等动态特性。这种设计使得 QT 具有高度的灵活性和可扩展性,开发者可以方便地创建自定义组件和扩展现有功能。
信号槽机制:这是 QT 最具特色的创新之一,它替代了传统的回调机制,实现了对象间的松耦合通信。信号槽机制具有类型安全、支持多对多连接、跨线程安全等优点,是 QT 区别于其他 GUI 工具包的核心特性。
丰富的组件库:QT 包含了数千个预定义类,覆盖了 GUI、网络、数据库、多媒体等各种应用场景,大大减少了重复开发的工作量。这些组件经过精心设计和优化,提供了一致的接口和良好的性能。
工具链集成:QT 提供了完整的开发工具链,包括 QT Creator 集成开发环境、QT Designer 可视化设计工具、性能分析工具等。这些工具的紧密集成使得开发效率得到显著提升。
模块化设计 :QT 采用高度模块化的设计,将功能按领域划分成独立模块,既降低了耦合度,也允许开发者按需引入模块。例如,仅开发桌面应用时可以排除移动相关模块,这种设计理念在 QT 6 中得到了进一步强化(8)。
2. 模块组织与架构设计
2.1 QT6 模块分类体系
QT 6 采用了更加清晰和现代化的模块分类体系,主要分为三大类别:基础模块(Essential Modules)、附加模块(Add-on Modules)和扩展模块(Extension Modules)。
** 基础模块(Essential Modules)** 定义了 QT 在所有平台上的基础,这些模块在所有支持的开发平台和测试的目标平台上都可用。基础模块是通用模块,对大多数 QT 应用程序都有用,它们在整个 QT 6 系列中将保持源代码和二进制兼容(除了测试模块只保持源代码兼容)。
基础模块的核心组件包括:
- Qt Core:提供核心的非图形类,是所有其他模块的基础,包含了元对象系统、容器类、事件处理、线程、I/O 操作等基础功能
- Qt GUI:提供图形用户界面组件的基础类,包括字体、颜色、图像、事件处理等,是 Qt Widgets 和 Qt Quick 的基础
- Qt Widgets:提供传统的基于窗口的 UI 组件和控件,如按钮、文本框、菜单等,是桌面应用开发的主要模块
- Qt Network:提供网络编程功能,使网络编程更简单、更可移植,支持 TCP、UDP、HTTP 等协议
- Qt Qml:提供 QML 和 JavaScript 语言的运行时支持,包括 QML 引擎、JavaScript 解释器等
- Qt Quick:提供声明式 UI 开发框架,用于构建具有自定义用户界面的高动态应用程序,适合移动和嵌入式设备
** 附加模块(Add-on Modules)** 为特定用途带来额外价值,这些模块可能仅适用于某些开发平台。许多附加模块要么功能完备,存在向后兼容性,要么只适用于某些平台,每个附加模块都会单独说明其兼容性承诺。
附加模块涵盖了各种专业功能领域,包括:
- Qt Bluetooth:提供对蓝牙硬件的访问,支持蓝牙设备的发现、连接和数据传输
- Qt Charts:提供用于数据可视化的图表组件,支持折线图、柱状图、饼图等多种图表类型
- Qt Multimedia:提供音频、视频处理功能,包括媒体播放、录制、编解码等
- Qt SQL:提供数据库访问功能,支持 SQLite、MySQL、PostgreSQL 等多种数据库
- Qt 3D:提供 3D 图形渲染和场景管理功能,支持复杂的 3D 场景构建
- Qt WebEngine:基于 Chromium 的 Web 浏览器引擎,用于在应用中嵌入网页内容
** 扩展模块(Extension Modules)** 为 QT 带来了额外的功能,它们可能是特定 QT 版本的一部分,但在发布时间、平台支持、QT 提供的二进制文件、商业支持或兼容性承诺方面可能与其他 QT 模块有所不同。
2.2 核心模块功能与依赖关系
QT 的模块依赖关系呈现清晰的树状结构,核心依赖关系为:Qt Core → Qt GUI → Qt Widgets,同时 Qt Core → Qt Qml → Qt Quick → Qt Quick Controls。这种依赖关系设计确保了模块之间的层次清晰,避免了循环依赖。
Qt Core 模块 是整个 QT 框架的基础,其他所有模块都直接或间接依赖于它。Qt Core 提供了以下核心功能(45):
- 元对象系统:支持信号槽机制、运行时类型信息、动态属性等
- 事件循环:提供应用程序的事件处理机制
- 对象模型:基于 QObject 的对象树管理和内存自动回收
- 容器类:提供各种数据结构,如 QList、QMap、QSet 等
- 线程管理:支持多线程编程,包括线程、互斥锁、信号量等
- 文件和 I/O 操作:提供统一的文件系统接口
- 时间和日期管理:提供日期、时间、定时器等功能
- 国际化支持:提供字符串翻译和本地化功能
Qt GUI 模块 建立在 Qt Core 之上,为图形界面提供基础支持。它包含了窗口系统、事件处理、2D 图形、基本的图像和字体支持等(38)。Qt GUI 的主要功能包括:
- 窗口管理:提供 QWindow 类作为所有窗口的基础
- 图形渲染:提供 QPainter 用于 2D 绘图,支持反锯齿、渐变等效果
- 字体和文本:提供字体管理、文本渲染和复杂文本布局支持
- 图像和像素图:提供图像加载、保存、处理功能
- 颜色管理:提供颜色空间转换和颜色操作功能
- OpenGL 支持:提供 OpenGL 上下文管理和 OpenGL 集成
Qt Widgets 模块基于 Qt GUI 构建,提供了传统的桌面 GUI 组件库。所有控件都继承自 QWidget,形成了丰富的控件层次结构:
- 输入类控件:QLineEdit(单行文本)、QTextEdit(多行文本)、QComboBox(下拉框)、QCheckBox(复选框)
- 显示类控件:QLabel(文本 / 图像)、QProgressBar(进度条)、QTableView(表格)
- 容器类控件:QFrame(框架)、QTabWidget(标签页)、QDialog(对话框)
Qt Qml 和 Qt Quick 模块提供了现代的声明式 UI 开发方式。Qt Qml 提供了 QML 语言的运行时支持,而 Qt Quick 则提供了基于 QML 的可视化组件库。Qt Quick Controls 提供了轻量级的 QML 类型,用于为桌面、嵌入式和移动设备创建性能良好的用户界面,这些控件具有统一的外观和感觉,同时支持主题定制。
2.3 QT6 vs QT5 模块组织的变化
QT 6 相比 QT 5 在模块组织上进行了重大重构,这些变化反映了架构设计理念的演进和技术发展的需求。
模块系统的重新组织 是最显著的变化。QT 5 采用基于 Qt Essentials(核心模块)和 Qt Add-ons(附加模块)的模块化系统,而 QT 6 重新组织为 Qt Base(基础模块)和 Qt Additional Libraries(附加库),模块更加细化和独立(62)。这种重新组织不仅是名称上的改变,更体现了对模块职责边界的重新定义和功能的重新划分。
模块的拆分和重组 是 QT 6 架构改进的重要方面。QT 6 将 QT 5 中庞大的 Qt Widgets、Qt Gui 模块拆分为更细粒度的组件,例如将原 Qt Gui 中的图形渲染功能独立为 Qt Shader Tools,将字体处理模块分离为 Qt Font Database(4)。这种细粒度的拆分带来了几个重要优势:
- 减少了模块间的耦合度,使得每个模块的职责更加清晰
- 提高了模块的可重用性,开发者可以按需选择特定功能
- 改善了编译时间,只编译需要的模块而不是整个庞大的库
- 支持更精细的版本控制和更新策略
新模块的引入体现了 QT 对现代技术需求的响应。QT 6 引入了多个新模块,其中最重要的包括:
- Qt 5 Core Compatibility APIs:提供 QT 5 核心 API 的兼容性支持,帮助开发者平滑迁移现有应用
- Qt Shader Tools:专门用于图形和计算着色器的处理,支持跨平台的着色器编译和管理
- Qt Rendering Hardware Interface (RHI) :新的图形抽象层,支持 Vulkan、Metal 和 Direct3D 12,提供了更好的图形性能和跨平台一致性(7)
废弃和移除的模块反映了技术的演进和淘汰。QT 6 移除了一些过时或不再维护的模块,例如 Qt OpenGL 模块(其中的 QGL 前缀类被移除),相关功能被迁移到新的模块中。
构建系统的改变是 QT 6 的另一个重大变化。QT 6 全面转向 CMake 作为其官方构建系统,取代了 QT 5 使用的 qmake。这种改变不仅是构建工具的替换,更带来了构建系统的现代化和标准化,使得 QT 的构建过程更加灵活和可配置。
性能优化 在模块组织变化中也得到了体现。QT 6 改进了信号槽机制,性能提升约 20-30%(7)。同时,默认使用新的图形抽象层(RHI),支持 Vulkan、Metal 和 Direct3D 12,相比 QT 5 基于 OpenGL 的图形堆栈,提供了更好的图形性能和硬件加速支持(7)。
3. 信号槽机制详解
3.1 信号槽的基本原理与实现
信号槽机制是 QT 的核心创新之一,它提供了一种类型安全、松耦合的对象间通信机制。这一机制的设计理念是替代传统的回调函数,使得对象之间的通信更加灵活和可维护。
信号槽的基本概念可以通过一个简单的例子来说明。在 GUI 编程中,当我们改变一个控件时,通常希望另一个控件得到通知。例如,当滑块(QSlider)的值发生变化时,我们希望标签(QLabel)能够显示新的值。在传统的回调机制中,滑块需要知道标签的存在并直接调用其更新函数,这种方式会导致对象间的紧耦合。而在 QT 的信号槽机制中,滑块只需要发出一个 "值改变" 的信号,而不需要知道谁会接收这个信号;标签只需要声明一个槽函数来处理值改变的事件,而不需要知道信号的发送者是谁。
信号槽机制的实现基础是 QT 的元对象系统(Meta-Object System)。这个系统基于三个核心组件构建:
- QObject 类:所有支持信号槽机制的类的基类,提供了元对象系统的基础功能
- Q_OBJECT 宏:在类定义中使用,用于启用元对象功能,包括信号、槽和动态属性
- 元对象编译器(moc):处理包含 Q_OBJECT 宏的类,生成实现元对象功能所需的代码
当一个类声明包含 Q_OBJECT 宏时,moc 工具会读取这个 C++ 头文件,生成一个包含元对象代码的 C++ 源文件。这个生成的源文件包含了信号槽的实现代码、运行时类型信息以及其他元对象功能(97)。
信号的定义和发射遵循特定的语法规则。信号使用 signals 关键字声明,例如:
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| class Counter : public QObject { Q_OBJECT public: int value() const { return m_value; } void setValue(int value); signals: void valueChanged(int newValue); private: int m_value = 0; }; |
信号的声明不需要实现体,因为 moc 会自动生成信号的实现代码。信号是公有的成员函数,可以从任何地方发射,但 QT 推荐只从定义信号的类及其子类中发射信号。当信号被发射时,使用 emit 关键字,例如:
|------------------------------------------------------------------------------------------------------------|
| void Counter::setValue(int value) { if (value != m_value) { m_value = value; emit valueChanged(value); } } |
槽的定义和使用与普通的 C++ 成员函数类似,使用 slots 关键字声明。槽可以是公有的、受保护的或私有的,可以被虚函数修饰,也可以被重载。例如:
|----------------------------------------------------------------------------------------------------------------------------------------------|
| class MyWidget : public QWidget { Q_OBJECT public: MyWidget(QObject *parent = nullptr); public slots: void onValueChanged(int newValue); }; |
槽函数的实现与普通成员函数相同:
|---------------------------------------------------------------------------------------------------------|
| void MyWidget::onValueChanged(int newValue) { // 处理值改变事件 qDebug() << "New value is:" << newValue; } |
3.2 信号槽的类型安全与连接方式
类型安全机制是信号槽机制的重要特性。信号槽机制确保类型安全:信号的签名必须与接收槽的签名匹配。实际上,槽可以有比它接收的信号更短的签名,因为它可以忽略额外的参数。由于签名是兼容的,编译器可以在使用基于函数指针的语法时帮助检测类型不匹配。基于字符串的 SIGNAL 和 SLOT 语法会在运行时检测类型不匹配。
这种类型安全机制带来了几个重要优势:
- 编译时检查:使用 C++11 的函数指针语法时,编译器可以在编译阶段检测信号槽连接的类型错误
- 运行时安全:即使使用传统的字符串语法,QT 也会在运行时检查类型匹配,避免程序崩溃
- 参数传递安全:信号的参数会正确传递给槽函数,支持任意类型的参数
连接方式的演进反映了 QT 的发展历程。从 QT 5.0 开始,QT 提供了两种不同的信号槽连接语法:基于字符串的连接语法和基于仿函数的连接语法,这两种语法各有优缺点。
基于字符串的连接语法是 QT 传统的连接方式,使用 SIGNAL () 和 SLOT () 宏:
|----------------------------------------------------------------------------------|
| connect(sender, SIGNAL(valueChanged(int)), receiver, SLOT(onValueChanged(int))); |
这种语法的优点是:
- 向后兼容性好,支持所有 QT 版本
- 可以连接到重载的槽函数
- 可以在运行时动态创建连接
缺点是:
- 缺乏编译时类型检查
- 字符串拼写错误只能在运行时发现
- 不支持 lambda 表达式
基于仿函数的连接语法是 QT 5 引入的新特性,使用函数指针:
|--------------------------------------------------------------------------------|
| connect(sender, &Sender::valueChanged, receiver, &Receiver::onValueChanged); |
这种语法的优点是:
- 提供编译时类型检查
- 支持自动补全和代码导航
- 可以连接到 lambda 表达式
- 更清晰的语法结构
缺点是:
- 不支持所有的重载情况
- 需要明确指定函数指针类型
连接类型的选择为信号槽机制提供了更多的灵活性。QT 支持多种连接类型,通过 connect 函数的第五个参数指定:
- Qt::AutoConnection(默认):自动判断线程,如果信号发送者和接收者在同一个线程,使用直接连接;否则使用队列连接
- Qt::DirectConnection:信号发射时立即调用槽函数,槽函数在信号发送者的线程中执行
- Qt::QueuedConnection:信号发射时将事件放入接收者线程的事件队列,槽函数在接收者的线程中异步执行
- Qt::BlockingQueuedConnection:与 QueuedConnection 类似,但会阻塞发送者线程直到槽函数执行完毕
- Qt::UniqueConnection:如果连接已经存在,则连接失败
lambda 表达式的支持是 QT 5.1 及以后版本的重要特性。可以将 lambda 表达式作为槽函数连接到信号:
|-----------------------------------------------------------------------------------------------------------------------------------|
| connect(sender, &Sender::valueChanged, [=](int newValue) { // 处理值改变事件 qDebug() << "Lambda: New value is:" << newValue; }); |
这种方式特别适合简单的一次性连接,避免了定义专门的槽函数。
3.3 信号槽的性能特征与优化
性能开销分析是理解信号槽机制的重要方面。相比直接的函数调用,信号槽机制确实存在一定的性能开销。根据 QT 官方文档,发射一个连接了某些槽的信号大约比直接调用接收者慢 10 倍。这个开销包括定位连接对象、安全地迭代所有连接(检查后续接收者在发射期间没有被销毁)以及以通用方式编组任何参数。
然而,这个性能开销需要从实际应用的角度来理解。虽然 10 倍的开销听起来很大,但与其他常见操作相比,这个开销其实是相当小的。例如,任何涉及 new 或 delete 操作的操作都会产生比信号槽大得多的开销。当执行字符串、向量或列表操作时,这些操作背后的 new 或 delete 操作使得信号槽的开销只占整个函数调用成本的很小一部分。
实际性能测试数据 提供了更具体的性能参考。根据一些独立的性能测试,直接连接(同一线程)的信号槽调用延迟约为 0.1μs,队列连接(跨线程)约为 2μs,这个延迟远低于函数指针调用的开销(82)。这些数据表明,信号槽机制的性能开销在大多数实际应用中是可以接受的。
性能优化策略可以帮助开发者在需要高性能的场景中优化信号槽的使用:
- 避免过度使用信号槽:在性能关键的代码路径中,应优先使用直接函数调用而不是信号槽
- 使用适当的连接类型:对于同一线程内的通信,使用 DirectConnection 可以避免队列开销
- 批量处理信号:对于高频信号(如鼠标移动事件),可以实现批量处理机制,减少信号发射次数
- 优化参数传递:避免传递大对象作为信号参数,优先使用指针或引用
- 使用信号阻断:在需要暂时阻止信号发射时,可以使用 QSignalBlocker 类
跨线程信号槽的性能考虑特别重要,因为跨线程通信涉及额外的开销。当信号槽跨越线程边界时,QT 使用队列连接方式,这会带来以下开销:
- 参数的序列化和反序列化
- 事件的排队和调度
- 线程上下文的切换
为了优化跨线程信号槽的性能,可以考虑以下策略:
- 减少跨线程通信频率:通过批量处理或缓冲机制减少跨线程信号的数量
- 使用高效的数据类型:优先使用基本数据类型和 Qt 内置类型,避免复杂对象的传递
- 预分配内存:对于需要频繁传递的数据,可以预分配内存以避免动态分配开销
- 使用线程亲和性:将相关对象移动到同一线程以减少跨线程通信
连接数量对性能的影响 也是需要考虑的因素。当一个信号连接到大量槽函数时,信号发射的性能会下降。根据性能测试,当连接数量增加时,QT 信号的性能会显著下降,在某些极端情况下,信号可能比虚函数慢 57 倍(83)。
为了处理大量连接的情况,可以考虑以下优化策略:
- 使用信号映射器:对于多个相似对象的信号,可以使用 QSignalMapper 来统一处理
- 分组处理:将相关的槽函数组织成组,通过条件判断只调用需要的槽函数
- 延迟处理:对于非关键的槽函数,可以将其执行延迟到更合适的时机
4. 元对象系统剖析
4.1 元对象系统的组成与功能
QT 的元对象系统(Meta-Object System)是支撑信号槽机制的基础架构,同时提供了运行时类型信息、动态属性系统等高级功能。这个系统的设计使得 QT 能够实现许多 C++ 语言本身不具备的动态特性。
元对象系统的三大组成部分构成了一个完整的架构体系:
- QObject 基类:所有支持元对象特性的类的基类,提供了元对象系统的基础功能和接口。QObject 类定义了对象树结构、内存管理、事件处理等基础机制,是 QT 对象模型的核心。
- Q_OBJECT 宏:必须在每个需要元对象功能的类中使用,位于类声明的私有部分。这个宏展开后会声明几个由 moc 实现的成员函数,包括 metaObject ()、tr ()、qt_metacast () 等。如果在编译时出现 "undefined reference to vtable for YourClass" 这样的错误,通常是因为忘记运行 moc 或者没有在类中包含 Q_OBJECT 宏。
- 元对象编译器(moc) :这是元对象系统的核心工具,负责处理包含 Q_OBJECT 宏的类。moc 读取 C++ 源文件,识别包含 Q_OBJECT 宏的类声明,为每个这样的类生成一个包含元对象代码的 C++ 源文件。生成的文件通常命名为 moc_.cpp,需要与其他源代码一起编译和链接(97)。
元对象系统提供的核心功能远远超出了信号槽机制,包括以下几个方面:
- 信号槽机制:这是引入元对象系统的主要原因,提供了强大的对象间通信机制
- 运行时类型信息:提供了类似 RTTI 的功能,但不需要 C++ 编译器的原生 RTTI 支持
- 动态属性系统:允许在运行时设置和获取对象的属性
- 国际化支持:提供字符串翻译功能,支持应用程序的本地化
- 动态类型转换:提供 qobject_cast () 函数,支持安全的运行时类型转换
- 对象自省能力:允许在运行时获取类的信息、属性列表、信号槽列表等
4.2 元对象编译器(MOC)的工作原理
moc 的处理流程 体现了其作为预处理器的工作方式。moc 工具的处理过程可以分为以下几个步骤(97):
- 输入文件处理:moc 读取 C++ 头文件或源文件,分析其中的类声明。它会识别所有包含 Q_OBJECT 宏的类。
- 宏展开处理:moc 会处理 C++ 预处理器指令,包括 #include、#define 等,以确保能够正确解析类声明。
- 元对象代码生成 :对于每个包含 Q_OBJECT 宏的类,moc 生成一个包含元对象代码的 C++ 源文件。这个生成的文件包含了:
- 信号的实现代码
- 槽函数的映射表
- 运行时类型信息
- 属性系统的实现
- 其他元对象功能的实现
- 输出文件命名:生成的文件遵循特定的命名规则,例如对于名为 MyClass 的类,生成的文件名为 moc_myclass.cpp。这个文件需要与其他源代码一起编译。
- 编译集成 :生成的 moc 文件可以通过两种方式集成到项目中:
- 在类的实现文件中包含生成的 moc 文件(使用 #include "moc_myclass.cpp")
- 将 moc 文件作为单独的源文件进行编译和链接
moc 生成的关键代码结构包括以下几个重要部分:
- 静态元对象数据结构 :每个类都有一个静态的 QMetaObject 对象,包含了类的所有元信息,包括:
- 类名
- 父类信息
- 信号列表
- 槽函数列表
- 属性列表
- 枚举类型信息
- 类信息(使用 Q_CLASSINFO 宏声明)
- 信号的实现代码:moc 为每个信号生成具体的实现代码,这些代码负责管理信号的连接列表和发射过程。
- 槽函数映射表:moc 生成一个槽函数映射表,将槽函数的名称和参数类型映射到具体的函数指针。
- 运行时类型信息函数:包括 className ()、inherits ()、qt_metacast () 等函数的实现。
moc 的命令行选项提供了丰富的配置功能:
- -D[=]:定义预处理宏
- -E:仅预处理,不生成元对象代码
- -f[]:强制在输出中生成 #include 语句
- -i:在输出中不生成 #include 语句
- -I:添加头文件包含路径
- -M<key=value>:向插件附加额外的元数据
moc 的限制和注意事项需要开发者特别关注:
- 模板类限制:moc 不能处理包含 Q_OBJECT 宏的模板类。这是因为模板的实例化发生在编译期,而 moc 是一个预处理器工具。
- 多重继承要求:如果使用多重继承,moc 假定第一个继承的类是 QObject 的子类。因此,在多重继承中,QObject 必须是第一个基类:
|------------------------------------------------------------------------|
| class MyClass : public QObject, public OtherClass { Q_OBJECT // ... }; |
- 嵌套类限制:嵌套类不能包含信号或槽。
- 函数指针参数限制:信号和槽的参数不能是函数指针类型。
- 返回类型限制:信号和槽的返回类型不能是引用类型。
4.3 元对象信息的存储与访问
QMetaObject 类的结构和功能 是元对象系统的核心数据结构。QMetaObject 类包含了 QT 对象的所有元信息,每个 QObject 子类都会创建一个 QMetaObject 实例,存储该类的所有元数据(105)。
QMetaObject 类提供了以下重要功能:
- 获取类名:通过 className () 函数在运行时返回类名,无需 C++ 编译器的 RTTI 支持
- 类型检查:通过 inherits () 函数检查对象是否是某个类的实例或子类
- 属性访问:提供属性的元数据信息,支持动态属性系统
- 方法调用:通过 invokeMethod () 函数支持运行时方法调用
- 创建实例:通过 newInstance () 函数支持动态创建类的实例
元对象信息的存储结构采用了层次化的设计。每个 QMetaObject 实例包含了以下关键信息:
- 类层次信息 :
- 类名(const char* className)
- 父类的 QMetaObject 指针(const QMetaObject *superdata)
- 类信息列表(QMetaClassInfo)
- 信号信息 :
- 信号数量
- 信号名称和参数列表
- 信号的元数据
- 槽函数信息 :
- 槽函数数量
- 槽函数名称和参数列表
- 槽函数的元数据
- 槽函数的函数指针
- 属性信息 :
- 属性数量
- 属性名称
- 属性类型
- 读取和设置函数
- 枚举信息 :
- 枚举类型定义
- 枚举值名称映射
元对象信息的访问接口提供了丰富的查询功能。QMetaObject 类提供了一系列函数用于访问元对象信息:
|-------------------------------------------------|
| const QMetaObject *QObject::metaObject() const |
这个函数返回对象的元对象指针。例如,可以通过以下方式获取类名:
|------------------------------------------------------------------------------|
| QObject *obj = new MyClass; qDebug() << obj->metaObject()->className(); |
运行时类型信息的实现不依赖于 C++ 的 RTTI 机制,而是通过元对象系统自己实现。这带来了几个优势:
- 不需要编译器的 RTTI 支持,可以在禁用 RTTI 的环境中使用
- 支持跨动态库边界的类型转换
- 提供了更丰富的类型信息
动态属性系统是元对象系统的重要组成部分。通过 Q_PROPERTY 宏可以声明对象的属性,例如:
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| class MyClass : public QObject { Q_OBJECT Q_PROPERTY(int myProperty READ myProperty WRITE setMyProperty NOTIFY myPropertyChanged) public: int myProperty() const { return m_property; } void setMyProperty(int value) { if (value != m_property) { m_property = value; emit myPropertyChanged(value); } } signals: void myPropertyChanged(int value); private: int m_property = 0; }; |
动态属性可以在运行时通过 setProperty () 和 property () 函数访问:
|-------------------------------------------------------------------------------------------------|
| MyClass obj; obj.setProperty("myProperty", 42); int value = obj.property("myProperty").toInt(); |
元对象系统的高级应用包括:
- 运行时方法调用:通过 QMetaObject::invokeMethod () 可以在运行时调用对象的方法,支持同步和异步调用。
- 对象反射:可以在运行时获取对象的所有属性、信号和槽,实现类似反射的功能。
- 插件系统:结合 Q_PLUGIN_METADATA 宏,可以实现插件的动态加载和识别。
- 序列化:利用元对象信息,可以实现对象的序列化和反序列化。
5. 跨平台实现机制
5.1 平台抽象层(QPA)设计
QPA 架构的基本概念和作用是 QT 跨平台实现的核心。QPA(Qt Platform Abstraction)即 QT 平台抽象层,是 QT 5 中引入的重要架构,用于取代 QT 4 中的 QWS(Qt Window System)和嵌入式 Linux 平台的相关模块。QPA 的设计目标是提供一个统一的平台抽象接口,使得 QT 应用程序能够在不同的操作系统和窗口系统上运行,而无需修改应用程序代码。
QPA 架构的核心思想是将与平台相关的功能封装在插件中,通过统一的接口进行访问。这种设计使得 QT 可以支持多种平台,包括桌面系统(Windows、macOS、Linux)、移动平台(Android、iOS)以及嵌入式系统,而应用程序代码保持不变(115)。
QPA 的模块化架构设计 体现了高度的抽象化和可扩展性。QPA 架构包含以下几个主要组件(118):
- QPlatformIntegration:窗口系统集成的核心抽象类,负责管理平台相关的初始化、事件处理、资源管理等。
- QPlatformWindow:窗口抽象类,定义了窗口的基本行为和属性,包括窗口创建、显示、隐藏、大小调整等操作。
- QPlatformSurface:表面抽象类,用于管理图形表面的创建和渲染。
- QPlatformBackingStore:后台存储抽象类,用于管理窗口的后台缓冲区。
- QPlatformScreen:屏幕抽象类,提供屏幕相关的信息,如分辨率、像素密度等。
- QPlatformTheme:主题抽象类,负责平台特定的外观和感觉,包括颜色、字体、样式等。
- QPlatformDialogHelper:对话框助手抽象类,提供平台特定的对话框功能。
- QPlatformMenu:菜单抽象类,提供平台特定的菜单系统支持。
QPA 插件的实现方式 基于抽象类的子类化。QPA 插件通过对各种 QPlatform * 类进行子类化来实现平台特定的功能。每个平台都有自己的 QPA 插件,例如(118):
- Windows 平台:qwindows.dll(基于 Win32 API)
- macOS 平台:qcocoa.dll(基于 Cocoa)
- Linux X11 平台:qxcb.dll(基于 XCB 协议)
- Linux Wayland 平台:qwayland.dll(基于 Wayland 协议)
- Android 平台:qandroid.dll(基于 Android NDK)
- iOS 平台:qios.dll(基于 UIKit)
QPA 插件的加载机制 通过环境变量和命令行参数进行配置。QT 使用 QT_QPA_PLATFORM 环境变量和 - platform 命令行参数来指定使用的 QPA 插件。如果未指定,QT 会根据运行平台自动选择合适的插件(115)。
例如,要在 Linux 上强制使用 XCB 插件:
|----------------------------|
| export QT_QPA_PLATFORM=xcb |
要使用 EGLFS 插件(适用于嵌入式设备):
|------------------------------|
| export QT_QPA_PLATFORM=eglfs |
5.2 不同操作系统的适配策略
Windows 平台的适配实现基于 Win32 API 和 DirectX 技术栈。Windows 平台的 QPA 插件(qwindows.dll)提供了以下关键功能:
- 窗口管理:基于 Win32 API 创建和管理窗口,支持所有 Windows 特定的窗口样式和功能。
- 图形渲染:支持 GDI、GDI + 以及 Direct2D/Direct3D 图形接口,提供高性能的 2D 和 3D 渲染能力。
- 输入处理:处理 Windows 消息队列中的鼠标、键盘和触控事件。
- 字体管理:集成 Windows 字体系统,支持 TrueType 字体和 ClearType 渲染。
- 系统集成:提供与 Windows 系统功能的集成,如任务栏、系统托盘、文件关联等。
macOS 平台的适配实现基于 Cocoa 框架和 Core Graphics 技术。macOS 平台的 QPA 插件(qcocoa.dll)实现了以下功能:
- Cocoa 集成:基于 Cocoa 框架创建窗口和视图,充分利用 macOS 的原生界面特性。
- Core Graphics 渲染:使用 Core Graphics 进行 2D 渲染,支持 Quartz Extreme 硬件加速。
- Metal 支持:在 QT 6 中,支持使用 Metal 进行高性能图形渲染。
- Cocoa 特性集成:包括菜单栏集成、Dock 集成、Spotlight 集成等。
- 触控板支持:支持 macOS 的多点触控手势和 Force Touch 功能。
Linux 平台的适配实现面临多种窗口系统的挑战,QT 通过不同的插件提供支持:
- X11 平台(qxcb):基于 XCB 协议的 X11 窗口系统支持,提供了高效的 X11 集成。
- Wayland 平台(qwayland):支持 Wayland 窗口系统,提供原生的 Wayland 集成。
- EGLFS 平台(eglfs):专为嵌入式 Linux 设备设计,提供基于 EGL 的无窗口系统支持。
- LinuxFB 平台(linuxfb):提供基于 Linux Framebuffer 的简单图形支持。
移动平台的适配策略体现了 QT 对移动开发的重视:
- Android 平台(qandroid) :
- 基于 Android NDK 实现,提供原生 Activity 集成
- 支持 Android 的生命周期管理
- 集成 Android 的传感器、摄像头、音频等功能
- 使用 SurfaceView 进行图形渲染
- iOS 平台(qios) :
- 基于 UIKit 框架实现,提供原生 UIViewController 集成
- 支持 iOS 的自动布局和 Size Classes
- 集成 iOS 的各种系统功能,如相机、位置、推送通知等
- 使用 Core Animation 进行动画和渲染
嵌入式系统的特殊适配需要考虑资源限制和硬件特性:
- EGLFS 插件 :
- 适用于没有 X11 或 Wayland 的嵌入式设备
- 直接使用 EGL 和 OpenGL ES 进行渲染
- 支持多种显示控制器和图形硬件
- DirectFB 支持 :
- 提供对 DirectFB 框架的支持
- 适用于需要直接访问图形硬件的场景
- 自定义平台支持 :
- 通过 QPA 架构,可以为自定义操作系统开发 QPA 插件
- 只需要实现 QPlatform * 抽象类的接口
- 大大简化了平台移植工作
5.3 跨平台图形系统与事件循环
图形系统的跨平台抽象 是 QT 跨平台能力的重要组成部分。QT 的图形系统架构在 QT 6 中进行了重大改进,采用了新的渲染硬件接口(RHI)架构(25):
|-------------------------------------------------------------------------------|
| 应用程序层 (Qt Quick/Widgets) ↓ 渲染硬件接口层 (QRhi) ↓ 底层图形API (OpenGL/Vulkan/Metal/D3D) |
**QRhi(Qt Rendering Hardware Interface)** 是 QT 6 引入的新的图形抽象层,支持以下后端(25):
- OpenGL:传统的 OpenGL 图形接口,提供广泛的平台支持
- Vulkan:新一代的高性能图形 API,提供更好的硬件利用率
- Metal:Apple 平台的原生图形 API,提供最佳的性能表现
- Direct3D 11/12:Microsoft Windows 平台的 DirectX 图形接口
QRhi 的设计目标是提供一个统一的图形接口,使得应用程序可以在不同的图形硬件和操作系统上获得一致的性能和行为。通过 QRhi,开发者可以编写与平台无关的图形代码,同时充分利用底层硬件的特性。
事件循环的跨平台实现确保了应用程序在不同平台上的一致行为。QT 的事件循环机制基于以下几个核心组件:
- QCoreApplication:提供核心的事件循环功能,是所有 QT 应用程序的基础。
- QEventLoop:事件循环类,负责处理事件队列中的事件。
- QAbstractEventDispatcher:事件分发器抽象类,不同平台有不同的实现。
- 平台特定的事件源:包括定时器、文件描述符、窗口系统事件等。
事件处理流程在不同平台上的实现机制:
- 事件产生:用户输入、定时器到期、网络数据到达等都会产生事件。
- 事件分发:平台特定的事件分发器将事件转换为 QT 的事件对象。
- 事件处理:QT 的事件处理系统将事件发送给目标对象进行处理。
- 事件循环:QEventLoop 不断从事件队列中取出事件并处理,直到退出循环。
跨平台事件处理的特殊考虑包括:
- 鼠标事件:不同平台的鼠标事件特性存在差异,QT 进行了统一抽象。
- 键盘事件:处理不同平台的键盘布局和修饰键差异。
- 触控事件:支持多种触控技术,包括单点触控和多点触控。
- 笔输入:支持数位板和手写笔输入。
平台特定功能的访问机制允许开发者在保持跨平台性的同时访问特定平台的功能:
- 类型转换函数:QT 提供了平台特定类型的转换函数,例如 QString::fromNSString () 用于 macOS 平台。
- 本地接口访问:通过 QNativeInterface 类可以访问平台特定的接口,例如:
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| #ifdef Q_OS_MAC using namespace QNativeInterface; if (auto *cocoaGLContext = glContext->nativeInterface<QCocoaGLContext>()) { [cocoaGLContext->nativeContext() makeCurrentContext]; } #endif |
- 窗口句柄操作:通过 QWindow::winId () 和 QWindow::fromWinId () 函数,可以在 QT 窗口和平台特定窗口句柄之间进行转换。
- 平台插件接口:某些功能需要直接访问 QPA 插件的接口,可以通过 QGuiApplication::platformNativeInterface () 获取。
6. 技术实现深度解析
6.1 内存管理与对象模型
QT 的内存管理机制基于独特的对象树模型,这种设计提供了自动内存管理功能,大大简化了开发者的内存管理工作。
对象树模型的基本原理是 QT 内存管理的核心。当一个 QObject 对象被创建时,可以指定一个父对象。在对象树中,父对象负责管理其子对象的生命周期。当父对象被销毁时,它会自动销毁所有子对象。这种机制形成了一个递归的删除过程,确保没有内存泄漏。
对象树的工作原理如下:
- 对象创建:当创建 QObject 对象时,可以在构造函数中指定父对象:
|-----------------------------------------------------------------------------------------------|
| QWidget *parentWidget = new QWidget(); QPushButton *button = new QPushButton(parentWidget); |
- 父子关系:子对象会自动添加到父对象的 children () 列表中,可以通过 parent () 函数获取父对象。
- 自动销毁:当父对象被 delete 时,会递归调用所有子对象的 deleteLater () 函数,确保它们在事件循环的下一次迭代中被销毁。
- 所有权转移:当对象的父对象改变时,所有权也随之转移。新的父对象将负责管理该对象的生命周期。
内存管理的具体实现机制包括以下几个方面:
- deleteLater () 函数:这是 QT 提供的安全删除对象的方法。调用 deleteLater () 的对象不会立即被销毁,而是被添加到一个删除队列中,在事件循环的下一次迭代中被删除。这种机制避免了在对象被其他代码使用时发生崩溃。
- QPointer 类:这是一个智能指针类,用于指向 QObject 对象。当所指向的对象被销毁时,QPointer 会自动设置为 nullptr,避免悬空指针的问题。
- 对象清理器:QT 提供了 QObjectCleanupHandler 类,可以注册需要清理的对象,在应用程序退出时自动清理。
内存管理的性能考虑包括:
- 对象树的深度:过深的对象树可能影响性能,因为销毁时需要递归处理所有子对象。
- 动态对象创建:频繁创建和销毁对象可能影响性能,特别是在嵌入式设备上。
- 内存碎片:虽然 QT 的对象树机制简化了内存管理,但仍可能产生内存碎片。
6.2 事件处理系统架构
QT 的事件处理系统是其核心架构之一,负责处理用户输入、系统事件和应用程序事件。这个系统的设计体现了高度的灵活性和可扩展性。
事件系统的基本架构包括以下几个层次:
- 事件源:产生事件的对象,如鼠标、键盘、定时器等。
- 事件对象:QEvent 及其子类,封装了事件的类型和数据。
- 事件分发器:负责将事件分发给目标对象。
- 事件处理器:对象的事件处理函数,负责处理特定类型的事件。
事件类型的分类包括:
- 鼠标事件:QMouseEvent,包括鼠标按下、释放、移动、滚轮事件等。
- 键盘事件:QKeyEvent,包括按键按下和释放事件。
- 窗口事件:QResizeEvent(窗口大小改变)、QMoveEvent(窗口移动)、QCloseEvent(窗口关闭)等。
- 定时器事件:QTimerEvent,用于处理定时器到期事件。
- 拖放事件:QDragEnterEvent、QDropEvent 等,用于处理拖放操作。
- 自定义事件:可以通过继承 QEvent 类创建自定义事件类型。
事件处理的流程如下:
- 事件产生:由操作系统或应用程序产生原始事件。
- 事件转换:QPA 插件将平台特定的事件转换为 QT 的事件对象。
- 事件分发:QCoreApplication::notify () 函数将事件发送给目标对象。
- 事件过滤:如果对象安装了事件过滤器,事件会先经过过滤器处理。
- 事件处理:对象调用相应的事件处理函数,如 mousePressEvent ()、keyPressEvent () 等。
- 事件接受 / 忽略:事件处理函数可以决定接受或忽略事件,影响事件的后续处理。
事件过滤器机制提供了强大的事件拦截和处理能力:
- 安装过滤器:通过 QObject::installEventFilter () 函数为对象安装事件过滤器。
- 过滤器函数:实现 eventFilter () 函数来处理事件:
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| bool MyWidget::eventFilter(QObject *obj, QEvent *event) { if (obj == targetObject && event->type() == QEvent::KeyPress) { QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event); if (keyEvent->key() == Qt::Key_Escape) { // 处理Escape键 return true; // 事件已处理 } } return QWidget::eventFilter(obj, event); } |
- 全局过滤器:可以通过 QCoreApplication::instance ()->installEventFilter () 安装全局事件过滤器,处理应用程序中的所有事件。
事件处理的高级技术包括:
- 事件传播:事件可以在对象树中向上传播,父对象可以处理子对象未处理的事件。
- 事件映射:QApplication::sendEvent () 和 QApplication::postEvent () 函数可以发送和投递事件。
- 延迟事件处理:使用 QTimer::singleShot () 可以延迟事件处理。
- 跨线程事件:支持在不同线程之间发送事件,通过队列连接实现线程安全。
6.3 多线程与并发处理
QT 提供了强大的多线程支持,包括低级线程原语和高级并发框架,使得多线程编程变得更加简单和安全。
线程基础类包括:
- QThread 类:提供基本的线程功能,包括线程的创建、启动、停止和等待。
- QThreadPool 类:线程池管理类,用于管理一组线程,提高线程的重用性。
- QRunnable 接口:用于定义线程执行的任务,可以提交给 QThreadPool 执行。
线程使用的最佳实践推荐使用 "对象移动到线程" 模式而非子类化 QThread:
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| class Worker : public QObject { Q_OBJECT public slots: void doWork() { // 执行耗时操作 } signals: void finished(); }; int main() { QThread *thread = new QThread; Worker *worker = new Worker; worker->moveToThread(thread); connect(thread, &QThread::started, worker, &Worker::doWork); connect(worker, &Worker::finished, thread, &QThread::quit); connect(thread, &QThread::finished, thread, &QThread::deleteLater); connect(thread, &QThread::finished, worker, &Worker::deleteLater); thread->start(); return QCoreApplication::exec(); } |
这种模式的优势包括:
- 避免了线程安全问题,因为 QObject 的所有非线程安全函数都在其关联线程中执行。
- 支持信号槽的跨线程通信,自动处理线程间的事件传递。
- 更好的代码结构,将工作逻辑与线程管理分离。
并发框架提供了高级的多线程编程接口:
- QtConcurrent 模块 :提供了无需使用底层线程原语的多线程编程类,包括:
- 并行算法:map ()、filter ()、reduce () 等
- 运行函数:run () 函数可以在任意线程中运行函数
- 分解器:用于将大任务分解为多个小任务并行执行
- Future 和 Promise 模式 :
- QFuture 类表示异步操作的结果
- QFutureWatcher 类用于监视异步操作的状态
- QPromise 类用于设置异步操作的结果
- 并行容器:提供了线程安全的容器类,如 QReadWriteLock、QConcurrentMap 等。
线程安全机制包括:
- 互斥锁:QMutex、QReadWriteLock 等用于保护共享资源。
- 信号量:QSemaphore 用于控制访问共享资源的线程数量。
- 等待条件:QWaitCondition 用于线程间的同步。
- 原子操作:提供了 atomic 模板类和相关函数。
跨线程信号槽通信的特殊处理:
- 自动线程检测:信号槽连接会自动检测发送者和接收者的线程。
- 队列连接:跨线程的信号槽使用队列连接,确保线程安全。
- 参数传递:跨线程信号槽的参数必须是可拷贝的,QT 会自动进行深拷贝。
- 性能考虑:跨线程信号槽的开销比同一线程内的信号槽高,需要注意优化。
7. 开发工具链与生态系统
7.1 QT Creator 与集成开发环境
QT Creator 是 QT 官方提供的集成开发环境(IDE),专门为 QT 开发而设计,提供了丰富的功能和工具,大大提高了开发效率。
QT Creator 的核心功能特性包括:
- 代码编辑 :
- 支持 C++、QML、JavaScript 等多种编程语言
- 提供智能代码完成和语法高亮
- 支持代码重构和代码导航
- 集成版本控制系统(Git、SVN 等)
- 可视化设计 :
- 集成 QT Designer,支持拖拽式 UI 设计
- 实时预览 UI 效果
- 支持响应式设计和多种屏幕尺寸
- 集成样式表编辑器
- 项目管理 :
- 支持 CMake 和 QMake 项目
- 多配置管理(Debug/Release 等)
- 构建系统集成
- 依赖关系管理
- 调试功能 :
- 集成 GDB 调试器
- 支持断点调试、变量监视、栈跟踪
- 内存调试和性能分析
- 远程调试支持
- 性能分析工具 :
- QT 性能分析器(QPA)
- CPU 和内存使用情况分析
- 事件循环性能分析
- 渲染性能分析
QT Creator 的跨平台支持确保了在不同操作系统上的一致体验:
- Windows 平台:提供完整的 Windows 开发支持,包括 Visual Studio 编译器集成。
- macOS 平台:支持 Xcode 工具链,提供原生的 macOS 开发体验。
- Linux 平台:支持 GCC/G++ 编译器,提供与 Linux 开发环境的深度集成。
QT Creator 的扩展机制允许开发者根据需求定制开发环境:
- 插件系统:支持安装和开发自定义插件,扩展 IDE 功能。
- 脚本支持:通过 JavaScript 脚本可以自动化常见任务。
- 自定义快捷键:可以根据个人习惯配置快捷键。
- 主题定制:支持界面主题的更换和定制。
7.2 构建系统与编译流程
QT 6 的构建系统经历了重大变革,从 QT 5 的 qmake 全面转向 CMake,这一变化带来了构建系统的现代化和标准化。
CMake 构建系统的优势包括:
- 跨平台兼容性:CMake 是业界标准的跨平台构建系统,支持所有主要操作系统。
- 模块化设计:CMakeLists.txt 文件结构清晰,支持模块化构建。
- 依赖管理:自动处理源文件依赖关系,减少编译时间。
- 生成器支持:支持多种构建系统生成器,如 Unix Makefiles、Ninja、Xcode 等。
- 扩展性:支持自定义构建规则和脚本。
QT CMake 模块的使用简化了 QT 项目的配置:
- find_package () 函数:用于查找 QT 6 包:
|--------------------------------------------------------|
| find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets) |
- target_link_libraries () 函数:用于链接 QT 模块:
|----------------------------------------------------------------------|
| target_link_libraries(myapp PRIVATE Qt6::Core Qt6::Gui Qt6::Widgets) |
- QT 特定命令 :
- qt6_add_executable ():创建 QT 可执行文件
- qt6_add_library ():创建 QT 库
- qt6_add_qml_module ():创建 QML 模块
构建流程的关键步骤包括:
- 配置阶段 :
- CMake 解析 CMakeLists.txt 文件
- 查找依赖库和头文件
- 生成构建文件(Makefile 或 Ninja 文件)
- 编译阶段 :
- 编译源文件生成目标文件
- 处理 moc 文件(自动或手动)
- 处理 UI 文件(.ui)
- 处理资源文件(.qrc)
- 链接阶段 :
- 链接目标文件和库文件
- 生成可执行文件或库
moc 处理的集成方式:
- AUTOMOC 选项:在 CMake 中启用 AUTOMOC 选项可以自动处理 moc 文件:
|-----------------------|
| set(CMAKE_AUTOMOC ON) |
- 手动处理:也可以手动调用 moc:
|---------------------------------------------------------------------------------------------------------|
| qt6_wrap_cpp(MOC_SRCS myclass.h) add_executable(myapp {CMAKE_CURRENT_SOURCE_DIR}/main.cpp {MOC_SRCS}) |
构建系统的性能优化考虑:
- 并行编译:使用 - j 选项启用并行编译,加快编译速度。
- 增量构建:CMake 支持增量构建,只编译修改的文件。
- 预编译头文件:使用预编译头文件减少编译时间。
- 构建缓存:使用 CMake 的缓存机制避免重复配置。
7.3 性能优化工具与技术
QT 提供了丰富的性能优化工具和技术,帮助开发者提升应用程序的性能表现。
性能分析工具集包括:
- QT 性能分析器(QPA) :
- 分析 CPU 使用情况
- 跟踪函数调用和执行时间
- 识别性能瓶颈
- 内存分析工具 :
- QT 内存调试器
- 内存泄漏检测
- 内存使用分析
- 渲染性能分析 :
- 帧率监控
- 渲染时间分析
- 纹理和着色器性能分析
- 网络性能分析 :
- 网络请求延迟分析
- 带宽使用情况监控
代码优化技术:
- 对象池技术:对于频繁创建和销毁的对象,可以使用对象池提高性能。
- 延迟初始化:将对象的初始化延迟到真正需要时进行。
- 缓存优化:使用适当的缓存策略减少重复计算。
- 算法优化:选择高效的算法和数据结构。
图形性能优化:
- 渲染优化 :
- 使用硬件加速
- 减少绘制调用次数
- 优化纹理使用
- Qt Quick 优化 :
- 使用 Canvas 进行高性能绘制
- 避免不必要的动画
- 优化层叠和混合
- OpenGL/Vulkan 优化 :
- 使用现代图形 API 特性
- 优化着色器代码
- 管理好图形资源
内存优化策略:
- 对象管理优化 :
- 合理使用对象树,减少内存管理开销
- 使用智能指针管理动态内存
- 避免频繁的内存分配和释放
- 数据结构优化 :
- 选择合适的容器类型
- 预分配内存空间
- 使用更高效的数据类型
- 字符串优化 :
- 使用 QString 的隐式共享机制
- 避免不必要的字符串转换
- 使用字符串视图减少拷贝
多线程优化技术:
- 线程池使用:使用 QThreadPool 管理线程,避免频繁创建和销毁线程。
- 任务分解:将大任务分解为多个小任务并行执行。
- 线程亲和性:将对象移动到合适的线程以减少跨线程通信。
- 同步优化:使用高效的同步机制,减少锁竞争。
平台特定优化:
- Windows 平台 :
- 使用 Direct2D/Direct3D 进行图形渲染
- 利用 Windows 的高性能特性
- macOS 平台 :
- 使用 Metal 进行图形渲染
- 利用 Core Animation 优化动画
- Linux 平台 :
- 使用 OpenGL/Vulkan 进行硬件加速
- 利用系统的多线程特性
8. 架构图与类图
8.1 QT 整体架构分层图
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| QT 6 架构分层图 应用层 (Application Layer) ├── 业务逻辑层 │ ├── 数据处理模块 │ └── 算法模块 └── 用户界面层 ├── Qt Widgets 应用 └── Qt Quick 应用 UI框架层 (QML/Widgets) ├── Qt Widgets 模块 │ ├── QWidget (基础控件) │ ├── QPushButton (按钮) │ ├── QLineEdit (输入框) │ └── QMainWindow (主窗口) └── Qt Quick 模块 ├── QML 引擎 ├── Qt Quick Controls └── Qt Quick 3D 核心模块层 (Qt Core) ├── 元对象系统 │ ├── QObject (基类) │ ├── QMetaObject (元对象信息) │ └── moc (元对象编译器) ├── 容器类 │ ├── QList │ ├── QMap │ └── QSet ├── 线程管理 │ ├── QThread │ ├── QThreadPool │ └── QtConcurrent ├── 事件系统 │ ├── QEvent │ └── QEventLoop └── 基础功能 ├── 文件I/O ├── 网络通信 └── 时间管理 平台抽象层 (Platform Abstraction) ├── QPA 插件 │ ├── Windows (qwindows.dll) │ ├── macOS (qcocoa.dll) │ ├── Linux X11 (qxcb.dll) │ ├── Linux Wayland (qwayland.dll) │ ├── Android (qandroid.dll) │ └── iOS (qios.dll) ├── 图形抽象层 (QRhi) │ ├── OpenGL │ ├── Vulkan │ ├── Metal │ └── Direct3D └── 本地接口 ├── 窗口系统接口 ├── 图形接口 └── 输入设备接口 |
8.2 核心模块类图
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| QT核心模块类图 QObject (抽象类) ├── QCoreApplication │ ├── QGuiApplication │ │ └── QApplication │ └── QLockFile ├── QIODevice (抽象类) │ ├── QFile │ ├── QTcpSocket │ └── QUdpSocket ├── QTimer ├── QThread └── QEvent (抽象类) ├── QMouseEvent ├── QKeyEvent ├── QPaintEvent └── QTimerEvent QObject (信号槽机制) ├── 信号 (Signals) │ ├── void destroyed(QObject*) │ └── void objectNameChanged(const QString&) ├── 槽 (Slots) │ ├── void deleteLater() │ └── void setObjectName(const QString&) └── 元对象函数 ├── const QMetaObject* metaObject() const ├── QString tr(const char*) const └── bool isWidgetType() const QMetaObject ├── 类信息 │ ├── className() │ ├── superClass() │ └── classInfo() ├── 信号信息 │ ├── methodCount() │ └── method() ├── 槽函数信息 │ ├── slotCount() │ └── slot() └── 属性信息 ├── propertyCount() └── property() |
8.3 信号槽机制类图
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 信号槽机制核心类图 QObject ├── 信号管理 │ ├── SignalMapper │ └── ConnectionList ├── 槽函数管理 │ ├── MethodTable │ └── MethodPointer └── 连接管理 ├── Connection ├── ConnectionList └── ConnectionManager 信号槽连接过程: Sender (QObject) │ ├── emit signal() │ └──> ConnectionList │ └──> Receiver (QObject) │ └──> slot() 连接类型: ├── Qt::AutoConnection ├── Qt::DirectConnection ├── Qt::QueuedConnection ├── Qt::BlockingQueuedConnection └── Qt::UniqueConnection 参数传递: ├── 基本类型 (int, float, QString) ├── 自定义类型 (需注册) └── 指针类型 (QObject*) |
8.4 元对象系统类图
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 元对象系统类图 QMetaObject ├── 类层次信息 │ ├── superdata (父类) │ ├── classNames │ └── classInfoList ├── 信号信息 │ ├── signalCount │ └── signalList (QMetaMethod数组) ├── 槽函数信息 │ ├── slotCount │ └── slotList (QMetaMethod数组) └── 属性信息 ├── propertyCount └── propertyList (QMetaProperty数组) QMetaMethod ├── 方法名 ├── 参数列表 ├── 返回类型 └── 方法标志 QMetaProperty ├── 属性名 ├── 属性类型 ├── 读取函数 ├── 设置函数 └── 通知信号 QMetaEnum ├── 枚举名 ├── 值列表 └── 名称映射 元对象编译器 (moc) 工作流程: 源文件 (.h) │ └── moc │ └── 生成 moc_*.cpp │ └── 编译链接 │ └── 可执行文件 |
8.5 跨平台实现类图
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 跨平台实现类图 QPlatformIntegration (抽象类) ├── 窗口系统集成 │ ├── createPlatformWindow() │ ├── createPlatformSurface() │ └── createPlatformScreen() ├── 输入系统 │ ├── createPlatformCursor() │ └── createPlatformInputContext() └── 资源管理 ├── createPlatformFontDatabase() └── createPlatformTheme() 平台插件实现: QWindowsIntegration (Windows) ├── 基于 Win32 API ├── Direct2D/Direct3D 图形 └── Windows 消息处理 QCocoaIntegration (macOS) ├── 基于 Cocoa 框架 ├── Core Graphics 渲染 └── Metal 图形支持 QXcbIntegration (Linux X11) ├── 基于 XCB 协议 ├── OpenGL/XRender 渲染 └── X11 事件处理 QWaylandIntegration (Linux Wayland) ├── 基于 Wayland 协议 ├── EGL/GLES 渲染 └── Wayland 事件处理 QPA 架构: 应用程序 │ └── QGuiApplication │ └── QPlatformIntegration │ └── 平台插件 │ └── 操作系统 API |
9. 总结与实践建议
9.1 QT 架构设计的核心要点
通过对 QT 架构的深入分析,我们可以总结出以下核心要点:
模块化设计理念的成功实践:QT 6 的模块化架构体现了现代软件设计的最佳实践。基础模块(Essential Modules)提供了稳定的核心功能,附加模块(Add-on Modules)满足了特定需求,扩展模块(Extension Modules)提供了创新功能。这种设计使得开发者可以按需选择模块,减少了不必要的依赖,提高了编译效率和运行时性能。
元对象系统的创新价值:QT 的元对象系统不仅支撑了信号槽机制,还提供了运行时类型信息、动态属性系统、国际化支持等功能。这个系统的设计避免了对 C++ RTTI 的依赖,提供了更强大的反射能力,使得 QT 具备了许多其他 C++ 框架不具备的动态特性。
跨平台抽象的高效实现:QPA 架构通过插件机制实现了真正的跨平台支持。开发者可以编写一次代码,在 Windows、macOS、Linux、Android、iOS 等多个平台上运行。QPA 插件的设计使得平台移植变得简单,只需要实现相应的 QPlatform * 接口即可。
信号槽机制的设计优势:信号槽机制提供了类型安全、松耦合的对象间通信方式。这种机制不仅简化了代码编写,还提高了系统的可维护性和可扩展性。跨线程信号槽的自动处理机制特别值得称赞,大大简化了多线程编程的复杂性。
性能与灵活性的平衡:QT 在提供丰富功能的同时,通过各种优化技术保持了良好的性能。例如,信号槽机制虽然比直接函数调用慢约 10 倍,但这个开销在大多数应用中是可以接受的。同时,QT 提供了多种优化选项,允许开发者根据具体需求进行性能调优。
9.2 架构设计对开发的指导意义
应用程序架构设计建议:
- 合理使用模块:根据应用需求选择合适的 QT 模块,避免引入不必要的依赖。例如,纯控制台应用可能只需要 Qt Core 模块,而图形界面应用需要 Qt Widgets 或 Qt Quick 模块。
- 分层架构设计:遵循 QT 的分层架构思想,将应用程序分为表现层、业务逻辑层和数据访问层。表现层使用 QT Widgets 或 Qt Quick,业务逻辑层使用 Qt Core 的容器和算法,数据访问层使用 Qt SQL 或其他数据访问模块。
- 组件化开发:利用 QT 的模块化特性,将应用程序分解为独立的组件。每个组件可以独立开发、测试和部署,提高了代码的重用性和可维护性。
- 接口设计:在设计组件接口时,优先使用信号槽机制而不是直接函数调用,以实现松耦合设计。这样可以方便地更换组件实现,而不影响其他部分的代码。
性能优化策略:
- 避免过度使用元对象功能:虽然元对象系统功能强大,但也有一定的性能开销。在性能关键的代码路径中,应避免使用动态属性、运行时类型检查等功能。
- 优化信号槽使用 :
- 对于高频信号(如定时器),考虑批量处理
- 避免跨线程信号槽的频繁调用
- 使用适当的连接类型,同一线程内使用 DirectConnection
- 避免传递大对象作为信号参数
- 内存管理优化 :
- 充分利用对象树机制进行自动内存管理
- 使用 QPointer 避免悬空指针
- 在性能关键的场景中,可以考虑使用智能指针或手动内存管理
- 图形性能优化 :
- 使用硬件加速,避免软件渲染
- 减少绘制调用次数
- 优化纹理和字体使用
- 在 Qt Quick 中使用 Canvas 进行高性能绘制
跨平台开发注意事项:
- 平台差异处理:不同平台在某些功能上存在差异,需要进行条件编译或使用平台抽象接口。
- UI 适配:不同平台的用户界面规范不同,需要为每个平台提供适当的 UI 样式。
- 性能调优:不同平台的性能特征不同,需要针对特定平台进行优化。例如,Windows 平台可以充分利用 DirectX,macOS 平台可以利用 Metal 和 Core Animation。
- 功能检测:某些功能可能在特定平台上不可用,需要在运行时进行检测和处理。
9.3 后续学习与实践方向
深入学习建议:
- 阅读官方文档 :QT 官方文档是最好的学习资源,特别是以下几个部分:
- Qt 6 技术规范和模块说明
- 信号槽机制详细说明
- 元对象系统参考文档
- QPA 架构设计文档
- 研究源代码 :QT 的源代码是学习其架构设计的宝贵资源。重点关注以下模块:
- QtCore 模块的基础类实现
- 信号槽机制的底层实现
- QPA 插件的具体实现
- 图形渲染模块的架构
- 实践项目 :通过实际项目来加深理解,可以从以下项目开始:
- 简单的桌面应用(使用 Qt Widgets)
- 响应式 UI 应用(使用 Qt Quick)
- 多线程应用(使用 QThread 和信号槽)
- 跨平台应用(在多个平台上测试)
- 性能优化实践 :
- 使用 QT 性能分析器分析应用性能
- 实现不同的优化策略并比较效果
- 研究 QT 官方示例的性能优化技巧
进阶技术方向:
- 高级图形技术 :
- 学习使用 Vulkan/Metal 进行高性能渲染
- 研究 Qt Quick 3D 的架构和使用
- 实现自定义渲染效果
- 嵌入式开发 :
- 学习在嵌入式设备上部署 QT 应用
- 研究 EGLFS 等嵌入式平台的特性
- 实现硬件加速的图形应用
- 移动开发 :
- 学习 QT for Android/iOS 的开发技巧
- 研究移动平台的特殊优化技术
- 实现跨平台移动应用
- 插件系统开发 :
- 学习开发 QPA 插件
- 实现自定义的平台抽象
- 开发 QT 扩展模块
社区参与建议:
- 参与 QT 论坛:QT 官方论坛是学习和交流的好地方,可以提问、回答问题、分享经验。
- 贡献开源项目:参与 QT 相关的开源项目,不仅可以学习,还可以为社区做出贡献。
- 技术分享:将自己的学习心得和经验分享给其他开发者,可以加深理解并帮助他人。
- 关注 QT 发展:QT 是一个持续发展的框架,关注其新版本的特性和改进,可以及时掌握最新技术。
参考资料
1\] QT---概览_qt底层架构-CSDN博客[https://blog.csdn.net/2301_80079642/article/details/149348323](https://blog.csdn.net/2301_80079642/article/details/149348323 " https://blog.csdn.net/2301_80079642/article/details/149348323") \[2\] Qt 6中的新功能[https://www.qt.io/zh-cn/product/qt6/technical-specifications](https://www.qt.io/zh-cn/product/qt6/technical-specifications " https://www.qt.io/zh-cn/product/qt6/technical-specifications") \[3\] Qt6和C++高级编程指南-腾讯云开发者社区-腾讯云[https://cloud.tencent.cn/developer/article/2592563?policyId=undefined](https://cloud.tencent.cn/developer/article/2592563?policyId=undefined " https://cloud.tencent.cn/developer/article/2592563?policyId=undefined") \[4\] Qt6和C++高级编程指南_搜狐网[https://m.sohu.com/a/933568362_122515195/](https://m.sohu.com/a/933568362_122515195/ " https://m.sohu.com/a/933568362_122515195/") \[5\] 【QT教程】QT6嵌入式开发_qt 嵌入式开发-CSDN博客[https://blog.csdn.net/mtyxb/article/details/138922322](https://blog.csdn.net/mtyxb/article/details/138922322 " https://blog.csdn.net/mtyxb/article/details/138922322") \[6\] Qt 6 相比 Qt 5 的主要提升与更新_qt6和qt5区别-CSDN博客[https://blog.csdn.net/weixin_73414031/article/details/142698364](https://blog.csdn.net/weixin_73414031/article/details/142698364 " https://blog.csdn.net/weixin_73414031/article/details/142698364") \[7\] Qt5与Qt6的区别_qt6是否兼容qt5-CSDN博客[https://blog.csdn.net/weixin_44840658/article/details/153739221](https://blog.csdn.net/weixin_44840658/article/details/153739221 " https://blog.csdn.net/weixin_44840658/article/details/153739221") \[8\] QT原理与源码分析之QT5原理与源码分析视频课程 补天云QT技术培训Qt 5 是挪威 Trolltech(后被 Noki - 掘金[https://juejin.cn/post/7550480186014433289](https://juejin.cn/post/7550480186014433289 " https://juejin.cn/post/7550480186014433289") \[9\] Qtの新しいブリッジ機能:過去を振り返って未来へ前進[https://www.qt.io/ja-jp/blog/about-the-new-qt-bridging-technology](https://www.qt.io/ja-jp/blog/about-the-new-qt-bridging-technology " https://www.qt.io/ja-jp/blog/about-the-new-qt-bridging-technology") \[10\] Qt主要模块深度解析:架构、应用与技术选型_karen的技术博客_51CTO博客[https://blog.51cto.com/u_12187/14254955](https://blog.51cto.com/u_12187/14254955 " https://blog.51cto.com/u_12187/14254955") \[11\] qt框架的系统总体架构_mob64ca140088a9的技术博客_51CTO博客[https://blog.51cto.com/u_16213617/13003888](https://blog.51cto.com/u_16213617/13003888 " https://blog.51cto.com/u_16213617/13003888") \[12\] Crash course in Qt for C++ developers, Part 7[https://www.cleanqt.io/blog/crash-course-in-qt-for-c%2B%2B-developers,-part-7](https://www.cleanqt.io/blog/crash-course-in-qt-for-c%2B%2B-developers,-part-7 " https://www.cleanqt.io/blog/crash-course-in-qt-for-c%2B%2B-developers,-part-7") \[13\] Qt类架构清晰图解与详细说明 - CSDN文库[https://wenku.csdn.net/doc/322njcxqw1](https://wenku.csdn.net/doc/322njcxqw1 " https://wenku.csdn.net/doc/322njcxqw1") \[14\] qt架构升级_mob64ca12d36217的技术博客_51CTO博客[https://blog.51cto.com/u_16213312/13040045](https://blog.51cto.com/u_16213312/13040045 " https://blog.51cto.com/u_16213312/13040045") \[15\] Qt 6 est disponible. Cette version est compatible C++ 17[https://qt.developpez.com/actu/311118/Qt-6-est-disponible-Cette-version-est-compatible-Cplusplus-17-apporte-une-nouvelle-architecture-graphique-et-s-accompagne-du-module-Qt-Quick-3D-pour-la-creation-de-scenes-3D-complexes/?amp](https://qt.developpez.com/actu/311118/Qt-6-est-disponible-Cette-version-est-compatible-Cplusplus-17-apporte-une-nouvelle-architecture-graphique-et-s-accompagne-du-module-Qt-Quick-3D-pour-la-creation-de-scenes-3D-complexes/?amp " https://qt.developpez.com/actu/311118/Qt-6-est-disponible-Cette-version-est-compatible-Cplusplus-17-apporte-une-nouvelle-architecture-graphique-et-s-accompagne-du-module-Qt-Quick-3D-pour-la-creation-de-scenes-3D-complexes/?amp") \[16\] 使用PySide6/PyQt6实现Python跨平台GUI框架的开发-CSDN博客[https://blog.csdn.net/weixin_30696613/article/details/145892618](https://blog.csdn.net/weixin_30696613/article/details/145892618 " https://blog.csdn.net/weixin_30696613/article/details/145892618") \[17\] Qt Interface Framework Simulation System[https://doc-snapshots.qt.io/interfaceframework-6.8/simulation-system.html](https://doc-snapshots.qt.io/interfaceframework-6.8/simulation-system.html " https://doc-snapshots.qt.io/interfaceframework-6.8/simulation-system.html") \[18\] qt体系结构,以图形形式展现 - CSDN文库[https://wenku.csdn.net/answer/m2gpgfnoo8](https://wenku.csdn.net/answer/m2gpgfnoo8 " https://wenku.csdn.net/answer/m2gpgfnoo8") \[19\] QT上位机软件架构设计_mob649e815c000a的技术博客_51CTO博客[https://blog.51cto.com/u_16175465/13416718](https://blog.51cto.com/u_16175465/13416718 " https://blog.51cto.com/u_16175465/13416718") \[20\] QT代码流程图 - CSDN文库[https://wenku.csdn.net/answer/4b3tgqjk57](https://wenku.csdn.net/answer/4b3tgqjk57 " https://wenku.csdn.net/answer/4b3tgqjk57") \[21\] 【QT教程】QT6音视频技术解析与架构设计 QT音视频-CSDN博客[https://blog.csdn.net/mtyxb/article/details/138654956](https://blog.csdn.net/mtyxb/article/details/138654956 " https://blog.csdn.net/mtyxb/article/details/138654956") \[22\] 用"分层架构"打造单体应用_qt c++ 三层架构之间通信-CSDN博客[https://blog.csdn.net/qq_35809147/article/details/151419920](https://blog.csdn.net/qq_35809147/article/details/151419920 " https://blog.csdn.net/qq_35809147/article/details/151419920") \[23\] QT技术架构的设计文档_mob64ca12cfec58的技术博客_51CTO博客[https://blog.51cto.com/u_16213298/13196112](https://blog.51cto.com/u_16213298/13196112 " https://blog.51cto.com/u_16213298/13196112") \[24\] 【AI辅助生成】QT 3D基础设施技术架构分析 为什么QT 3D技术栈如此复杂?-CSDN博客[https://blog.csdn.net/qtprofessional/article/details/154247440](https://blog.csdn.net/qtprofessional/article/details/154247440 " https://blog.csdn.net/qtprofessional/article/details/154247440") \[25\] 附加模块--Qt OpenGL模块功能及架构_qt6::opengl-CSDN博客[https://blog.csdn.net/kangjunfei/article/details/148515422](https://blog.csdn.net/kangjunfei/article/details/148515422 " https://blog.csdn.net/kangjunfei/article/details/148515422") \[26\] Qt 6.10[https://doc.qt.io/qt-6/zh/index.html](https://doc.qt.io/qt-6/zh/index.html " https://doc.qt.io/qt-6/zh/index.html") \[27\] Qt 6 详细介绍-CSDN博客[https://blog.csdn.net/2301_76542477/article/details/155411298](https://blog.csdn.net/2301_76542477/article/details/155411298 " https://blog.csdn.net/2301_76542477/article/details/155411298") \[28\] Qt6和C++高级编程指南-腾讯云开发者社区-腾讯云[https://cloud.tencent.com.cn/developer/article/2592563?frompage=seopage\&policyId=undefined](https://cloud.tencent.com.cn/developer/article/2592563?frompage=seopage&policyId=undefined " https://cloud.tencent.com.cn/developer/article/2592563?frompage=seopage&policyId=undefined") \[29\] 【AI辅助生成】QT 3D基础设施技术架构分析 为什么QT 3D技术栈如此复杂? - 送码网[https://m.songma.com/m/news/txtlist_i78189v.html](https://m.songma.com/m/news/txtlist_i78189v.html " https://m.songma.com/m/news/txtlist_i78189v.html") \[30\] qt体系结构,以图形形式展现 - CSDN文库[https://wenku.csdn.net/answer/m2gpgfnoo8](https://wenku.csdn.net/answer/m2gpgfnoo8 " https://wenku.csdn.net/answer/m2gpgfnoo8") \[31\] QT上位机软件架构设计_mob649e815c000a的技术博客_51CTO博客[https://blog.51cto.com/u_16175465/13416718](https://blog.51cto.com/u_16175465/13416718 " https://blog.51cto.com/u_16175465/13416718") \[32\] qt widgets应用程序框架示意图 - CSDN文库[https://wenku.csdn.net/answer/28fz9469zs](https://wenku.csdn.net/answer/28fz9469zs " https://wenku.csdn.net/answer/28fz9469zs") \[33\] qt项目软件架构设计_mob64ca12eee07b的技术博客_51CTO博客[https://blog.51cto.com/u_16213425/12954644](https://blog.51cto.com/u_16213425/12954644 " https://blog.51cto.com/u_16213425/12954644") \[34\] Qt qml的软件架构设计_qobject::connect(view.engine(), signal(quit()), vi-CSDN博客[https://blog.csdn.net/qq_35865125/article/details/83042954](https://blog.csdn.net/qq_35865125/article/details/83042954 " https://blog.csdn.net/qq_35865125/article/details/83042954") \[35\] qt C++的软件框架 - CSDN文库[https://wenku.csdn.net/answer/3ftv2jf2tg](https://wenku.csdn.net/answer/3ftv2jf2tg " https://wenku.csdn.net/answer/3ftv2jf2tg") \[36\] PyQt6 界面架构设计 - CSDN文库[https://wenku.csdn.net/answer/5w736x7wy1](https://wenku.csdn.net/answer/5w736x7wy1 " https://wenku.csdn.net/answer/5w736x7wy1") \[37\] Qt 6 详细介绍-CSDN博客[https://blog.csdn.net/2301_76542477/article/details/155411298](https://blog.csdn.net/2301_76542477/article/details/155411298 " https://blog.csdn.net/2301_76542477/article/details/155411298") \[38\] 【QT教程】QT6嵌入式开发_qt 嵌入式开发-CSDN博客[https://blog.csdn.net/mtyxb/article/details/138922322](https://blog.csdn.net/mtyxb/article/details/138922322 " https://blog.csdn.net/mtyxb/article/details/138922322") \[39\] Qt6打包高级教程:构建跨平台独立应用程序的终极指南 - CSDN文库[https://wenku.csdn.net/column/2be81h5wit](https://wenku.csdn.net/column/2be81h5wit " https://wenku.csdn.net/column/2be81h5wit") \[40\] QT代码流程图 - CSDN文库[https://wenku.csdn.net/answer/4b3tgqjk57](https://wenku.csdn.net/answer/4b3tgqjk57 " https://wenku.csdn.net/answer/4b3tgqjk57") \[41\] Qt体系 - CSDN文库[https://wenku.csdn.net/answer/57oyv1rm28](https://wenku.csdn.net/answer/57oyv1rm28 " https://wenku.csdn.net/answer/57oyv1rm28") \[42\] qt架构升级_mob64ca12d36217的技术博客_51CTO博客[https://blog.51cto.com/u_16213312/13040045](https://blog.51cto.com/u_16213312/13040045 " https://blog.51cto.com/u_16213312/13040045") \[43\] 第6章Qt框架功能概述_qt remoteobjects 是默认安装模块吗-CSDN博客[https://blog.csdn.net/weixin_39604637/article/details/150525004](https://blog.csdn.net/weixin_39604637/article/details/150525004 " https://blog.csdn.net/weixin_39604637/article/details/150525004") \[44\] All Modules \| Qt 6.10[https://doc.qt.io/qt-6/zh/qtmodules.html](https://doc.qt.io/qt-6/zh/qtmodules.html " https://doc.qt.io/qt-6/zh/qtmodules.html") \[45\] Qt 6 框架中的基础模块与附加模块_qt6基本模块-CSDN博客[https://blog.csdn.net/qq_43689451/article/details/142722283](https://blog.csdn.net/qq_43689451/article/details/142722283 " https://blog.csdn.net/qq_43689451/article/details/142722283") \[46\] 【QT教程】QT6 QML编程-CSDN博客[https://blog.csdn.net/mtyxb/article/details/138462898](https://blog.csdn.net/mtyxb/article/details/138462898 " https://blog.csdn.net/mtyxb/article/details/138462898") \[47\] Qt6 C++ 开发指南学习记录三_qt6 c++开发指南-CSDN博客[https://blog.csdn.net/2401_87797168/article/details/143922267](https://blog.csdn.net/2401_87797168/article/details/143922267 " https://blog.csdn.net/2401_87797168/article/details/143922267") \[48\] Qt Building Blocks[https://www.qt.io/product/qt6/qml-book/ch01-meetqt-blocks](https://www.qt.io/product/qt6/qml-book/ch01-meetqt-blocks " https://www.qt.io/product/qt6/qml-book/ch01-meetqt-blocks") \[49\] Qt 6.3.0 Modules[https://wiki.qt.io/Qt_6.3.0_Modules](https://wiki.qt.io/Qt_6.3.0_Modules " https://wiki.qt.io/Qt_6.3.0_Modules") \[50\] Qt 6.10 Modules[https://wiki.qt.io/Qt_6.10_Modules](https://wiki.qt.io/Qt_6.10_Modules " https://wiki.qt.io/Qt_6.10_Modules") \[51\] qt_deploy_runtime_dependencies \| Qt Core \| Qt 6.10.0[https://doc.qt.io/qt-6/zh/qt-deploy-runtime-dependencies.html](https://doc.qt.io/qt-6/zh/qt-deploy-runtime-dependencies.html " https://doc.qt.io/qt-6/zh/qt-deploy-runtime-dependencies.html") \[52\] qt_deploy_qml_imports \| Qt Qml \| Qt 6.10.0[https://doc.qt.io/qt-6/de/qt-deploy-qml-imports.html](https://doc.qt.io/qt-6/de/qt-deploy-qml-imports.html " https://doc.qt.io/qt-6/de/qt-deploy-qml-imports.html") \[53\] QtWebEngine/Qt6Build[https://wiki.qt.io/QtWebEngine/Qt6Build](https://wiki.qt.io/QtWebEngine/Qt6Build " https://wiki.qt.io/QtWebEngine/Qt6Build") \[54\] 如何高效查阅Qt6文档?手把手教你读懂官方文档-CSDN博客[https://blog.csdn.net/2301_76677973/article/details/146232406](https://blog.csdn.net/2301_76677973/article/details/146232406 " https://blog.csdn.net/2301_76677973/article/details/146232406") \[55\] QtGUI模块架构解析_qt官方推荐的ui架构-CSDN博客[https://blog.csdn.net/kangjunfei/article/details/148382487](https://blog.csdn.net/kangjunfei/article/details/148382487 " https://blog.csdn.net/kangjunfei/article/details/148382487") \[56\] Qt项目开发架构 qt常用开发框架_mob6454cc70219b的技术博客_51CTO博客[https://blog.51cto.com/u_16099268/9425250](https://blog.51cto.com/u_16099268/9425250 " https://blog.51cto.com/u_16099268/9425250") \[57\] Qt6 QML自定义组件、资源系统、模块化。 - 丘狸尾 - 博客园[https://www.cnblogs.com/qiuliw/p/19043439](https://www.cnblogs.com/qiuliw/p/19043439 " https://www.cnblogs.com/qiuliw/p/19043439") \[58\] Qt 6 QML模块目录结构解析报告_qt6 qml插件-CSDN博客[https://telepan.blog.csdn.net/article/details/153938700](https://telepan.blog.csdn.net/article/details/153938700 " https://telepan.blog.csdn.net/article/details/153938700") \[59\] QT += core gui widgets # Qt5需要明确指定widgets模块 LIBS += -lQt5Core -lQt5Gui -lQt5Widge我是QT6修改你的内容 - CSDN文库[https://wenku.csdn.net/answer/815rm6zrrk](https://wenku.csdn.net/answer/815rm6zrrk " https://wenku.csdn.net/answer/815rm6zrrk") \[60\] Changes to Qt Modules in Qt 6 \| Qt 6.10[https://doc.qt.io/qt-6/zh/modulechanges.html](https://doc.qt.io/qt-6/zh/modulechanges.html " https://doc.qt.io/qt-6/zh/modulechanges.html") \[61\] Changes to Qt Core \| Qt Core 6.7.3[https://doc.qt.io/qt-6.7/qtcore-changes-qt6.html](https://doc.qt.io/qt-6.7/qtcore-changes-qt6.html " https://doc.qt.io/qt-6.7/qtcore-changes-qt6.html") \[62\] Qt5 与 Qt6 详细对比_qt6和qt5的区别-CSDN博客[https://blog.csdn.net/weixin_44248637/article/details/149423261](https://blog.csdn.net/weixin_44248637/article/details/149423261 " https://blog.csdn.net/weixin_44248637/article/details/149423261") \[63\] Qt5和Qt6在模块划分和3D支持上有哪些主要区别?_编程语言-CSDN问答[https://ask.csdn.net/questions/8205716](https://ask.csdn.net/questions/8205716 " https://ask.csdn.net/questions/8205716") \[64\] qt5与qt6开发差别 - CSDN文库[https://wenku.csdn.net/answer/4mi64utv2w](https://wenku.csdn.net/answer/4mi64utv2w " https://wenku.csdn.net/answer/4mi64utv2w") \[65\] Qt 5 到 Qt 6:Qt Multimedia 模块的升级与重构深度解析_qt6 multimedia-CSDN博客[https://blog.csdn.net/greenspan/article/details/151421902](https://blog.csdn.net/greenspan/article/details/151421902 " https://blog.csdn.net/greenspan/article/details/151421902") \[66\] Qt 6 QML模块目录结构解析报告_qt6 qml插件-CSDN博客[https://telepan.blog.csdn.net/article/details/153938700](https://telepan.blog.csdn.net/article/details/153938700 " https://telepan.blog.csdn.net/article/details/153938700") \[67\] qt5与qt6会兼容吗 - CSDN文库[https://wenku.csdn.net/answer/4tkkzzx6f6](https://wenku.csdn.net/answer/4tkkzzx6f6 " https://wenku.csdn.net/answer/4tkkzzx6f6") \[68\] qt5.9 和qt6的区别 - CSDN文库[https://wenku.csdn.net/answer/29keukwyue](https://wenku.csdn.net/answer/29keukwyue " https://wenku.csdn.net/answer/29keukwyue") \[69\] Signals and Slots[https://qt.developpez.com/doc/2.3/signalsandslots/](https://qt.developpez.com/doc/2.3/signalsandslots/ " https://qt.developpez.com/doc/2.3/signalsandslots/") \[70\] Signals and slots[https://plus.tuni.fi/graderC/static/compcs110-s2021/rounds/r12/03__signal_slot_en.html](https://plus.tuni.fi/graderC/static/compcs110-s2021/rounds/r12/03__signal_slot_en.html " https://plus.tuni.fi/graderC/static/compcs110-s2021/rounds/r12/03__signal_slot_en.html") \[71\] Qt signals and slots for newbies[https://wiki.qt.io/Qt_signals_and_slots_for_newbies](https://wiki.qt.io/Qt_signals_and_slots_for_newbies " https://wiki.qt.io/Qt_signals_and_slots_for_newbies") \[72\] New Signal Slot Syntax[https://wiki.qt.io/New_signal_slot_syntax](https://wiki.qt.io/New_signal_slot_syntax " https://wiki.qt.io/New_signal_slot_syntax") \[73\] How to Use Signals and Slots/es[https://wiki.qt.io/How_to_Use_Signals_and_Slots/es](https://wiki.qt.io/How_to_Use_Signals_and_Slots/es " https://wiki.qt.io/How_to_Use_Signals_and_Slots/es") \[74\] qt信号signal和槽slot机制_51CTO博客_mob6454cc6b413f的技术博客_51CTO博客[https://blog.51cto.com/u_16099234/14317890](https://blog.51cto.com/u_16099234/14317890 " https://blog.51cto.com/u_16099234/14317890") \[75\] 某司客户端面试真题------Qt信号槽-腾讯云开发者社区-腾讯云[https://cloud.tencent.com.cn/developer/article/2486176](https://cloud.tencent.com.cn/developer/article/2486176 " https://cloud.tencent.com.cn/developer/article/2486176") \[76\] Qt信号与槽机制实现原理_qt信号与槽实现机制原理-CSDN博客[https://blog.csdn.net/qq_39623515/article/details/146058162](https://blog.csdn.net/qq_39623515/article/details/146058162 " https://blog.csdn.net/qq_39623515/article/details/146058162") \[77\] 揭秘Qt信号与槽:高效通信的核心机制-CSDN博客[https://blog.csdn.net/2202_75382767/article/details/152118334](https://blog.csdn.net/2202_75382767/article/details/152118334 " https://blog.csdn.net/2202_75382767/article/details/152118334") \[78\] 《编程千问》第四问:QT中信号和槽机制的原理是什么?-腾讯云开发者社区-腾讯云[https://cloud.tencent.cn/developer/article/2479610](https://cloud.tencent.cn/developer/article/2479610 " https://cloud.tencent.cn/developer/article/2479610") \[79\] 【QT】Qt信号与槽机制详解_wx635691d193b70的技术博客_51CTO博客[https://blog.51cto.com/u_15844731/14166536](https://blog.51cto.com/u_15844731/14166536 " https://blog.51cto.com/u_15844731/14166536") \[80\] Qt之信号与槽机制 - TechNomad - 博客园[https://www.cnblogs.com/TechNomad/p/17787119.html](https://www.cnblogs.com/TechNomad/p/17787119.html " https://www.cnblogs.com/TechNomad/p/17787119.html") \[81\] qt designer combobox如何摄制信号槽_colddawn的技术博客_51CTO博客[https://blog.51cto.com/u_13303/13020124](https://blog.51cto.com/u_13303/13020124 " https://blog.51cto.com/u_13303/13020124") \[82\] 10倍提升QML性能:Qt与C++深度整合实战指南-CSDN博客[https://blog.csdn.net/gitblog_00662/article/details/148862613](https://blog.csdn.net/gitblog_00662/article/details/148862613 " https://blog.csdn.net/gitblog_00662/article/details/148862613") \[83\] QT signal performance significantly degrades when the number of the connections grow.[https://developernote.com/2022/08/qt-signal-performance-significantly-degrades-when-the-number-of-the-connections-grow/](https://developernote.com/2022/08/qt-signal-performance-significantly-degrades-when-the-number-of-the-connections-grow/ " https://developernote.com/2022/08/qt-signal-performance-significantly-degrades-when-the-number-of-the-connections-grow/") \[84\] Impossibly Fast Event\*[https://docs.google.com/presentation/d/1Y5JktAemPYNDmVJ5-3f_KQH1LTDmey-YJFAnly0Cxpo/htmlpresent](https://docs.google.com/presentation/d/1Y5JktAemPYNDmVJ5-3f_KQH1LTDmey-YJFAnly0Cxpo/htmlpresent " https://docs.google.com/presentation/d/1Y5JktAemPYNDmVJ5-3f_KQH1LTDmey-YJFAnly0Cxpo/htmlpresent") \[85\] Performance of signals/slots for plotting/oscilloscope (performance questions)[https://forum.qt.io/topic/107960/performance-of-signals-slots-for-plotting-oscilloscope-performance-questions/1](https://forum.qt.io/topic/107960/performance-of-signals-slots-for-plotting-oscilloscope-performance-questions/1 " https://forum.qt.io/topic/107960/performance-of-signals-slots-for-plotting-oscilloscope-performance-questions/1") \[86\] Performance comparison of the Qt Signals and Slots mechanism and the native C++ implementation[https://sii.pl/blog/en/ignals-i-slots-oraz-natywnej-implementacji-c/](https://sii.pl/blog/en/ignals-i-slots-oraz-natywnej-implementacji-c/ " https://sii.pl/blog/en/ignals-i-slots-oraz-natywnej-implementacji-c/") \[87\] 我的Qt八股文面试笔记1:信号与槽\&\& 文件流操作-CSDN博客[https://blog.csdn.net/charlie114514191/article/details/149323226](https://blog.csdn.net/charlie114514191/article/details/149323226 " https://blog.csdn.net/charlie114514191/article/details/149323226") \[88\] Qt6和C++高级编程指南-腾讯云开发者社区-腾讯云[https://cloud.tencent.com/developer/article/2592464?policyId=1003](https://cloud.tencent.com/developer/article/2592464?policyId=1003 " https://cloud.tencent.com/developer/article/2592464?policyId=1003") \[89\] 完整教程:Qt信号与槽在多线程编程中的应用与注意事项_mob6454cc6e1f98的技术博客_51CTO博客[https://blog.51cto.com/u_16099254/14289928](https://blog.51cto.com/u_16099254/14289928 " https://blog.51cto.com/u_16099254/14289928") \[90\] Qt线程使用(四)信号槽中的传递参数机制-CSDN博客[https://blog.csdn.net/Larry_Yanan/article/details/155534690](https://blog.csdn.net/Larry_Yanan/article/details/155534690 " https://blog.csdn.net/Larry_Yanan/article/details/155534690") \[91\] 信号与槽机制深度实战:复杂交易系统中高级通信技巧 - CSDN文库[https://wenku.csdn.net/column/5wwjuhoz2p](https://wenku.csdn.net/column/5wwjuhoz2p " https://wenku.csdn.net/column/5wwjuhoz2p") \[92\] 深入解析qt信号与槽:10大特性与最佳实践,加速你的开发流程[https://wenku.csdn.net/column/3on53k9mrp](https://wenku.csdn.net/column/3on53k9mrp " https://wenku.csdn.net/column/3on53k9mrp") \[93\] Qt框架下如何实现高效的跨线程通信? - CSDN文库[https://wenku.csdn.net/answer/avj6z999jd](https://wenku.csdn.net/answer/avj6z999jd " https://wenku.csdn.net/answer/avj6z999jd") \[94\] Qt信号与槽高级应用实战:3步彻底解耦界面与业务逻辑,提升系统可维护性 - CSDN文库[https://wenku.csdn.net/column/6e0158mc6v](https://wenku.csdn.net/column/6e0158mc6v " https://wenku.csdn.net/column/6e0158mc6v") \[95\] 元对象系统_百科[https://m.baike.com/wiki/%E5%85%83%E5%AF%B9%E8%B1%A1%E7%B3%BB%E7%BB%9F/6932833?baike_source=doubao](https://m.baike.com/wiki/%E5%85%83%E5%AF%B9%E8%B1%A1%E7%B3%BB%E7%BB%9F/6932833?baike_source=doubao " https://m.baike.com/wiki/%E5%85%83%E5%AF%B9%E8%B1%A1%E7%B3%BB%E7%BB%9F/6932833?baike_source=doubao") \[96\] QMetaObject Struct[https://doc-snapshots.qt.io/qt6-dev/qmetaobject.html](https://doc-snapshots.qt.io/qt6-dev/qmetaobject.html " https://doc-snapshots.qt.io/qt6-dev/qmetaobject.html") \[97\] Using the Meta-Object Compiler (moc) \| Qt 6.10[https://doc.qt.io/qt-6/zh/moc.html](https://doc.qt.io/qt-6/zh/moc.html " https://doc.qt.io/qt-6/zh/moc.html") \[98\] 【QT随笔】什么是Qt元对象专业的系统?Qt元对象架构的核心机制与应用实践_mob64ca14144dde的技术博客_51CTO博客[https://blog.51cto.com/u_16213700/14202319](https://blog.51cto.com/u_16213700/14202319 " https://blog.51cto.com/u_16213700/14202319") \[99\] Qt中的MOC元对象系统内部原理介绍与开发应用_qt moc-CSDN博客[https://blog.csdn.net/qianniulaoren/article/details/145689518](https://blog.csdn.net/qianniulaoren/article/details/145689518 " https://blog.csdn.net/qianniulaoren/article/details/145689518") \[100\] 【QT/C++】什么是Qt元对象系统?Qt元对象系统的核心机制与应用实践-CSDN博客[https://blog.csdn.net/yuhuasheng1997/article/details/151746928](https://blog.csdn.net/yuhuasheng1997/article/details/151746928 " https://blog.csdn.net/yuhuasheng1997/article/details/151746928") \[101\] 深入理解 Qt 元对象系统 (Meta-Object System)_qt元对象系统概念-CSDN博客[https://blog.csdn.net/2503_92624912/article/details/149755783](https://blog.csdn.net/2503_92624912/article/details/149755783 " https://blog.csdn.net/2503_92624912/article/details/149755783") \[102\] Qt Meta Object System-元对象系统-CSDN博客[https://blog.csdn.net/dichuangheng8094/article/details/101487215](https://blog.csdn.net/dichuangheng8094/article/details/101487215 " https://blog.csdn.net/dichuangheng8094/article/details/101487215") \[103\] qt uml - CSDN文库[https://wenku.csdn.net/answer/86pyx9f6t3](https://wenku.csdn.net/answer/86pyx9f6t3 " https://wenku.csdn.net/answer/86pyx9f6t3") \[104\] Qt类结构分析_51CTO博客_qt 结构体定义[https://blog.51cto.com/u_15930680/5990403](https://blog.51cto.com/u_15930680/5990403 " https://blog.51cto.com/u_15930680/5990403") \[105\] QMetaObject Struct \| Qt Core \| Qt 6.10.0[https://doc.qt.io/qt-6/zh/qmetaobject.html](https://doc.qt.io/qt-6/zh/qmetaobject.html " https://doc.qt.io/qt-6/zh/qmetaobject.html") \[106\] Meta Object System[https://qt.developpez.com/doc/3.3/metaobjects/](https://qt.developpez.com/doc/3.3/metaobjects/ " https://qt.developpez.com/doc/3.3/metaobjects/") \[107\] 深入了解Qt(二)之元对象系统(Meta-Object System)-CSDN博客[https://blog.csdn.net/weixin_33860147/article/details/86138037](https://blog.csdn.net/weixin_33860147/article/details/86138037 " https://blog.csdn.net/weixin_33860147/article/details/86138037") \[108\] 元对象系统 - 爱学习的小许? - 博客园[https://www.cnblogs.com/xuzhenxuexi/p/18963736](https://www.cnblogs.com/xuzhenxuexi/p/18963736 " https://www.cnblogs.com/xuzhenxuexi/p/18963736") \[109\] Qt Platform Abstraction(QPA)-CSDN博客[https://blog.csdn.net/weixin_55163060/article/details/131189984](https://blog.csdn.net/weixin_55163060/article/details/131189984 " https://blog.csdn.net/weixin_55163060/article/details/131189984") \[110\] Qt Platform Abstraction \| Platform Integration \| Qt 6.10.0[https://doc.qt.io/qt-6/ko/qpa.html](https://doc.qt.io/qt-6/ko/qpa.html " https://doc.qt.io/qt-6/ko/qpa.html") \[111\] Qt Quick Ultralite Platform API[https://doc-snapshots.qt.io/qtformcus-dev/platformapi.html](https://doc-snapshots.qt.io/qtformcus-dev/platformapi.html " https://doc-snapshots.qt.io/qtformcus-dev/platformapi.html") \[112\] Qt Platform Abstraction/zh - Qt Wiki[https://wiki.qt.io/Qt_Platform_Abstraction/zh](https://wiki.qt.io/Qt_Platform_Abstraction/zh " https://wiki.qt.io/Qt_Platform_Abstraction/zh") \[113\] Platform Integration \| Qt 6.10.0[https://doc.qt.io/qt-6/zh/platform-integration.html](https://doc.qt.io/qt-6/zh/platform-integration.html " https://doc.qt.io/qt-6/zh/platform-integration.html") \[114\] Qt中QPA插件,Qt跨平台的基础_qt qpa-CSDN博客[https://blog.csdn.net/lzqd1314/article/details/130484964](https://blog.csdn.net/lzqd1314/article/details/130484964 " https://blog.csdn.net/lzqd1314/article/details/130484964") \[115\] Qt的环境变量QT_QPA_PLATFORM浅解_qt platform 框架-CSDN博客[https://blog.csdn.net/jongden/article/details/153523062](https://blog.csdn.net/jongden/article/details/153523062 " https://blog.csdn.net/jongden/article/details/153523062") \[116\] Qt Platform Abstraction[https://stuff.mit.edu/afs/athena/software/texmaker_v5.0.2/qt57/doc/qtdoc/qpa.html](https://stuff.mit.edu/afs/athena/software/texmaker_v5.0.2/qt57/doc/qtdoc/qpa.html " https://stuff.mit.edu/afs/athena/software/texmaker_v5.0.2/qt57/doc/qtdoc/qpa.html") \[117\] QtGUI模块架构解析_qt官方推荐的ui架构-CSDN博客[https://blog.csdn.net/kangjunfei/article/details/148382487](https://blog.csdn.net/kangjunfei/article/details/148382487 " https://blog.csdn.net/kangjunfei/article/details/148382487") \[118\] Qt プラットフォームの抽象化[https://runebook.dev/ja/docs/qt/qpa](https://runebook.dev/ja/docs/qt/qpa " https://runebook.dev/ja/docs/qt/qpa") \[119\] android跨域设置 android 跨平台开发_mob6454cc77db30的技术博客_51CTO博客[https://blog.51cto.com/u_16099323/8624637](https://blog.51cto.com/u_16099323/8624637 " https://blog.51cto.com/u_16099323/8624637") (注:文档部分内容可能由 AI 生成)