对象模型
标准 C++ 对象模型为对象范式提供了非常有效的运行时支持。但它的静态特性在某些问题领域并不灵活。图形用户界面编程就是一个既需要运行时效率又需要高度灵活性的领域。Qt 将 C++ 的速度与 Qt 对象模型的灵活性结合在一起,从而提供了这种功能。
Qt 为 C++ 增加了这些功能:
- 一种非常强大的无缝对象通信机制,称为信号和插槽
- 可查询和可设计的对象属性
- 强大的事件和事件过滤器
- 用于国际化的上下文字符串翻译
- 复杂的时间间隔驱动计时器,可在事件驱动的图形用户界面中优雅地集成许多任务
- 分层和可查询的对象树,以自然的方式组织对象所有权
- 有保护的指针(QPointer )在引用对象被销毁时会自动设置为 0,这与普通 C++ 指针不同,普通 C++ 指针在对象被销毁时会变成悬空指针
- 可跨越库边界的动态转换。
- 支持自定义类型创建。
Qt XML 的许多功能都是基于从QObject 继承的标准 C++ 技术实现的。其他功能,如对象通信机制和动态属性系统,则需要 Qt XML 自己的Meta-Object Compiler (moc) 提供的元对象系统 (Meta -Object System )。
元对象系统是一种 C++ 扩展,它使 C++ 语言更适合真正的组件式图形用户界面编程。
重要类
这些类构成了 Qt 对象模型的基础。
有关类的其他信息 | |
顺序容器和关联容器的通用功能 | |
枚举器的元数据 | |
关于成员函数的元数据 | |
包含 Qt 对象的元信息 | |
关于属性的元数据 | |
允许对顺序容器进行类型擦除访问 | |
管理元对象系统中的命名类型 | |
所有 Qt 对象的基类 | |
监控多个 QObject 的生命周期 | |
为 QObject 提供受保护指针的模板类 | |
QObject::blockSignals() 的异常安全包装器 | |
捆绑来自可识别发送者的信号 | |
类似于最常见 Qt 数据类型的联合体 |
Qt 对象:身份与价值
上面列出的 Qt 对象模型的一些新增功能要求我们将 Qt 对象视为标识,而不是值。值是复制或分配的,而标识是克隆的。克隆是指创建一个新的标识,而不是旧标识的完全复制。例如,双胞胎有不同的身份。他们可能看起来一模一样,但却有不同的名字、不同的地点,而且可能拥有完全不同的社交网络。
因此,克隆身份是比复制或赋值更复杂的操作。我们可以在 Qt 对象模型中看到这意味着什么。
一个 Qt 对象...
- 可能有一个唯一的QObject::objectName() 。如果我们复制一个 Qt 对象,应该给复制的对象取什么名字?
- 在对象层次结构中有一个位置。如果我们复制一个 Qt 对象,该副本应位于何处?
- 可以连接到其他 Qt 对象,向它们发射信号或接收它们发射的信号。如果复制一个 Qt 对象,应如何将这些连接转移到副本?
- Qt 对象可以在运行时添加 C++ 类中未声明的新属性。如果我们复制一个 Qt 对象,副本中是否应包括添加到原始对象中的属性?
由于这些原因,Qt 对象应被视为标识,而不是值。标识是被克隆的,而不是被复制或赋值的,而且克隆一个标识是比复制或赋值更复杂的操作。因此,QObject 以及QObject 的所有子类(直接或间接)都禁用了copy constructor and assignment operator 。
© 2025 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.