对象模型

C++标准对象模型为对象范式提供了非常有效的运行时支持。但它在某些问题域中的静态性质是不灵活的。图形用户界面编程是这样一个领域,它既需要运行效率又需要高度的灵活性。Qt通过结合C++的速度和Qt对象模型的可灵活性,提供了这种支持。

Qt将这些特性添加到C++

许多这些Qt特性是用标准C++技术实现的,基于从QObject继承。其他,如对象通信机制和动态属性系统,需要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 对象视为标识符,而不是值。值可以被复制或赋值;而标识符被克隆。克隆意味着创建一个新的标识符,而不是旧的精确副本。例如,双胞胎具有不同的标识符。他们可能看起来完全相同,但他们有不同的名字,不同的位置,并且可能具有完全不同的社交网络。

因此,克隆一个标识符的操作比复制或赋值值更加复杂。我们可以在 Qt 对象模型中看到这一点。

一个 Qt 对象...

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

因此,Qt 对象应该被视为标识符,而不是值。标识符被克隆,而不是复制或赋值,克隆标识符的操作比复制或赋值值更复杂。因此,QObject 及其所有 QObject 的子类(直接或间接)都禁用了它们的 复制构造函数和赋值运算符

© 2024 Qt 公司。本文档中所包含的文档贡献的版权属于各自的拥有者。本提供的文档是根据自由软件基金会发布的 GNU 自由文档许可证版本 1.3 的条款许可的。Qt 及相关标志是芬兰及/或其他国家 Qt 公司的商标。所有其他商标均为各自所有者的财产。