Qt 对象模型(翻译)

本文最后更新于 2022年6月13日 下午

翻译信息

本文翻译自 Qt6 官方文档 Object Model

协议:本翻译遵守原文档使用的 GFDLv1.3 授权

译者:muzing

翻译时间:2022.06

标准 C++ 对象模型为对象范例提供了非常有效的运行时支持。但它的静态性质在某些具体问题领域不够灵活。GUI 编程是一个需要运行时效率和高灵活性的领域。Qt 通过将 C++ 的速度与 Qt 对象模型的灵活性相结合,来实现这一点。

Qt 为 C++ 添加了如下特性:

这些 Qt 特性中的许多是基于从 QObject 的继承,用标准 C++ 技术实现。其他的,比如对象通信机制和动态属性系统,需要由 Qt 自带的元对象编译器(moc)提供的元对象系统

元对象系统是一种 C++ 扩展,使得该语言更适合真正的组件 GUI 编程。

重要的类

这些类构成了 Qt 对象模型的基础。

QMetaClassInfo 关于类的附加信息
QMetaEnum 关于枚举器的元数据
QMetaMethod 关于成员函数的元数据
QMetaObject 包含有关 Qt 对象的元信息
QMetaProperty 关于属性的元数据
QMetaSequence 允许对顺序容器进行类型擦除访问
QMetaType 管理元对象系统中的具名类型
QObject 所有 Qt 对象的基类
QObjectCleanupHandler 监视多个 QObject 的生命周期
QPointer 模板类,提供受保护的指向 QObject 的指针
QSignalBlocker 包裹 QObject::blockSignals() 的异常安全包装器
QSignalMapper 绑定来自可识别发送者的信号
QVariant 行为类似于最常见的 Qt 数据类型的集合

Qt 对象:身份?值?

上面列出的 Qt 对象模型的一些附加功能要求我们将 Qt 对象视为身份(identities),而不是值(values)。值被复制或分配,身份被克隆。克隆意味着创建一个新的身份,而不是旧身份的精确复制品。例如,双胞胎有不同的身份。他们可能看起来相同,但名称不同、位置不同,并且可能有完全不同的社交圈子。

克隆身份是比复制或分配更复杂的操作。我们可以在 Qt 对象模型中看到这意味着什么。

一个 Qt 对象……

  • 可能有一个唯一的 QObject::objectName()。如果我们复制一个 Qt 对象,该给这个副本起什么名字呢?
  • 对象层次结构中占据一个位置。如果我们复制一个 Qt 对象,副本应该放在哪里?
  • 可以连接到其他 Qt 对象以向它们发出信号或接收它们发出的信号。如果我们复制一个 Qt 对象,该如何将这些连接转移到副本中呢?
  • 可以在运行时添加未在 C++ 类中声明的新属性。如果我们复制一个 Qt 对象,副本是否应该包括添加到原始对象的属性?

出于这些原因,Qt 对象应该被视为身份而不是值。身份是克隆的,而不是复制或分配的,克隆身份是比复制或分配值更复杂的操作。因此,QObject 及其所有直接或间接继承的子类,都被禁用了复制构造函数和赋值运算符


© 2022 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.


Qt 对象模型(翻译)
https://muzing.top/posts/c6731fe8/
作者
Muzing
发布于
2022年6月13日
更新于
2022年6月13日
许可协议