对象模型
标准的 C++ 对象模型为对象范式提供了非常高效的运行时支持。但在某些问题领域中,其静态特性却显得不够灵活。图形用户界面编程正是这样一个既需要运行时效率,又需要高度灵活性的领域。Qt 通过将 C++ 的速度与 Qt 对象模型的灵活性相结合,满足了这一需求。
Qt 为 C++ 增添了以下功能:
- 一种名为“信号与槽”的、用于实现无缝对象通信的极其强大的机制
- 可查询且可设计的对象属性
- 强大的事件和事件过滤器
- 用于国际化的上下文字符串翻译
- 功能完善的间隔驱动定时器,可将众多任务优雅地集成到事件驱动的图形用户界面中
- 分层且可查询的对象树,能以自然的方式组织对象所有权
- 受保护的指针(QPointer ),当被引用的对象被销毁时,这些指针会自动设置为 0;这与普通 C++ 指针不同,后者的对象被销毁后会变成悬空指针
- 一种可在库边界之间工作的动态强制类型转换。
- 支持自定义类型的创建。
Qt 的许多功能都是通过标准的 C++ 技术实现的,基于对QObject 的继承。其他功能,如对象通信机制和动态属性系统,则需要 Qt 自带的Meta-Object Compiler (moc)提供的元对象系统。
元对象系统是一种 C++ 扩展,使该语言更适合真正的组件化 GUI 编程。
重要类
这些类构成了 Qt 对象模型的基础。
允许通过类型消除方式访问关联容器 | |
关于类的补充信息 | |
顺序容器和关联容器的通用功能 | |
关于枚举器的元数据 | |
关于成员函数的元数据 | |
包含关于 Qt 对象的元信息 | |
关于属性的元数据 | |
允许以类型擦除的方式访问顺序容器 | |
管理元对象系统中的命名类型 | |
所有 Qt 对象的基类 | |
监视多个 QObject 的生命周期 | |
提供指向 QObject 的受保护指针的模板类 | |
围绕 QObject::blockSignals() 的异常安全封装 | |
将来自可识别发送者的信号打包 | |
像联合体一样处理最常见的 Qt 数据类型 |
Qt 对象:身份与值
上述为 Qt 对象模型列出的部分新增功能,要求我们将 Qt 对象视为“身份”,而非“值”。 值会被复制或赋值;而身份则会被克隆。克隆是指创建一个新的身份,而非旧身份的精确副本。例如,双胞胎拥有不同的身份。他们可能长得一模一样,但名字不同、所在位置不同,甚至可能拥有完全不同的社交圈。
因此,克隆一个身份比复制或赋值要复杂得多。我们可以在 Qt 对象模型中看到这一点。
一个 Qt 对象……
- 可能拥有一个唯一的QObject::objectName()。如果我们复制一个Qt对象,应该给副本起什么名字?
- 在对象层次结构中占据特定位置。如果复制一个 Qt 对象,副本应位于何处?
- 可以与其他 Qt 对象建立连接,向其发出信号或接收其发出的信号。如果复制一个 Qt 对象,应如何将这些连接转移到副本上?
- 可以在运行时向其添加未在 C++ 类中声明的新属性。如果复制一个 Qt 对象,副本是否应包含添加到原始对象中的这些属性?
基于这些原因,应将 Qt 对象视为“标识”,而非“值”。“标识”是克隆的,而非复制或赋值的,且克隆“标识”的操作比复制或赋值更为复杂。因此,QObject 以及QObject 的所有子类(无论是直接还是间接)都禁用了其copy constructor and assignment operator 方法。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.