对象模型

标准 C++ 对象模型为对象范式提供了非常有效的运行时支持。但它的静态特性在某些问题领域并不灵活。图形用户界面编程就是一个既需要运行时效率又需要高度灵活性的领域。Qt 将 C++ 的速度与 Qt 对象模型的灵活性结合在一起,从而提供了这种功能。

Qt 为 C++ 增加了这些功能:

Qt XML 的许多功能都是基于从QObject 继承的标准 C++ 技术实现的。其他功能,如对象通信机制和动态属性系统,则需要 Qt XML 自己的Meta-Object Compiler (moc) 提供的元对象系统 (Meta -Object System

元对象系统是一种 C++ 扩展,它使 C++ 语言更适合真正的组件式图形用户界面编程。

重要类

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

QMetaClassInfo

有关类的其他信息

QMetaContainer

顺序容器和关联容器的通用功能

QMetaEnum

枚举器的元数据

QMetaMethod

关于成员函数的元数据

QMetaObject

包含 Qt 对象的元信息

QMetaProperty

关于属性的元数据

QMetaSequence

允许对顺序容器进行类型擦除访问

QMetaType

管理元对象系统中的命名类型

QObject

所有 Qt 对象的基类

QObjectCleanupHandler

监控多个 QObject 的生命周期

QPointer

为 QObject 提供受保护指针的模板类

QSignalBlocker

QObject::blockSignals() 的异常安全包装器

QSignalMapper

捆绑来自可识别发送者的信号

QVariant

类似于最常见 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.