以下是 Qt 开发中最重要、最核心的概念和术语,我会按类别整理,并附上简要解释和重要性。
1. 核心基础概念
- QObject Qt 整个对象模型的基类。几乎所有 Qt 类都继承自 QObject。它提供了信号槽、属性系统、对象树、内存管理等核心能力。
- 信号与槽 (Signals & Slots) Qt 最标志性的机制。
- Signal:对象发出的“事件通知”(如按钮点击 clicked())。
- Slot:用于接收信号并执行的函数。 优点:松耦合、类型安全、支持跨线程通信。 使用:QObject::connect(sender, &Sender::signal, receiver, &Receiver::slot);
- 元对象系统 (Meta-Object System) Qt 通过 MOC (Meta-Object Compiler) 预处理器实现。 它让 C++ 在运行时支持信号槽、属性、类型信息、动态调用等动态特性(C++ 本身是静态语言)。
- MOC (Meta-Object Compiler) 专门处理 Q_OBJECT 宏的工具,会为每个 QObject 子类生成 moc_xxx.cpp 文件。
2. 对象模型与内存管理
- 对象树 (Object Tree) / 父子关系 (Parent-Child) Qt 使用父子对象关系自动管理内存:
- 当父对象析构时,会自动析构所有子对象。
- setParent()、parent() 等方法。 这极大简化了内存管理,避免内存泄漏。
- 属性系统 (Properties) 使用 Q_PROPERTY 宏定义的成员变量,支持在 QML 中绑定、在运行时动态读写、设计器中编辑等。
- 事件 (Event) 与 事件循环 (Event Loop)
- Qt 是事件驱动的框架。
- 所有界面交互、定时器、网络数据到达等都转化为 QEvent。
- QApplication::exec() 启动主事件循环,持续处理事件。
3. UI 开发两大体系
| 概念 | 说明 | 适用场景 |
|---|---|---|
| Qt Widgets | 传统控件系统(QWidget、QPushButton 等) | 传统桌面企业软件 |
| Qt Quick / QML | 声明式 UI 语言 + Scene Graph 硬件加速 | 现代应用、嵌入式、汽车 |
重要术语:
- QWidget:所有传统控件的基类。
- QML:Qt Meta Language,声明式 UI 语言(类似 JSON + JavaScript)。
- QQmlEngine:QML 引擎。
- Context Property:C++ 对象暴露给 QML 的方式。
- QQuickItem:QML 中所有可视项的基类。
4. 布局与 UI 管理
- Layout(布局管理器):QHBoxLayout、QVBoxLayout、QGridLayout、QFormLayout 等,用于自动排列控件。
- Size Policy(大小策略):QSizePolicy 控制控件如何在布局中伸缩。
- Style Sheet (QSS):Qt 的样式表,类似 CSS,用于美化界面。
5. 模型/视图架构 (Model/View)
- Model/View/Delegate 模式(强烈推荐使用):
- Model:数据模型(QAbstractListModel、QAbstractTableModel 等)
- View:视图组件(QListView、QTableView、QTreeView)
- Delegate:自定义每一项的绘制和编辑方式
- 在 QML 中对应 ListModel + ListView 等。
6. 多线程相关
- QThread:Qt 的线程类。
- Worker Object 模式(推荐):把耗时工作对象 moveToThread() 到新线程中。
- Qt Concurrent:高级并发工具(QtConcurrent::run())。
- QueuedConnection:跨线程信号槽必须使用这个连接方式。
7. 其他重要概念
- 国际化 (i18n):使用 tr() 函数 + Qt Linguist 工具。
- 资源系统 (Resource System):.qrc 文件,把图片、qml、配置文件打包进可执行文件。
- 插件系统 (Plugins):QPluginLoader,支持动态扩展。
- 智能指针:Qt 6 推荐使用 std::unique_ptr、QScopedPointer 等。
- CMake:Qt 6 官方推荐的构建系统(取代旧的 qmake)。
8. 常用宏与关键字
- Q_OBJECT:必须写在所有继承 QObject 的类中。
- signals:、public slots:、private slots:
- emit:触发信号的关键字。
- Q_INVOKABLE:让 C++ 函数能在 QML 中被调用。
- Q_ENUM、Q_FLAG:枚举类型暴露到 QML。
学习优先级建议
入门必须掌握(前 5 个):
- QObject + 对象树
- Signals & Slots + connect
- QWidget / QML 基础
- 事件循环
- 布局系统
进阶必须掌握:
- Model/View 架构
- C++ 与 QML 混合编程
- 多线程正确用法
- 属性系统与 Q_PROPERTY
浙公网安备 33010602011771号