对象模型

描述由Qt的动态对象模型实现的强大功能。

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

Qt 为 C++ 添加了以下功能:

  • 一种非常强大的无缝对象通信机制,称为信号和槽

  • 可查询和可设计的 对象属性

  • 强大的 事件和事件过滤器

  • 用于国际化的上下文字符串翻译

  • 复杂的间隔驱动计时器,使得在事件驱动的GUI中优雅地集成许多任务成为可能

  • 分层且可查询的对象树,以自然方式组织对象所有权

  • 受保护的指针(QPointer)在引用的对象被销毁时会自动设置为0,与普通的C++指针不同,后者在对象被销毁时会变成悬空指针。

  • 一个dynamic cast,可以在库边界之间工作。

  • 支持自定义类型的创建。

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

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

重要类

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

QMetaSequence

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

QMetaContainer

QMetaContainer 类为顺序容器和关联容器提供了通用功能。

PySide6.QtCore.QMetaObject

QMetaObject 类包含有关 Qt 对象的元信息。

PySide6.QtCore.QMetaMethod

QMetaMethod 类提供了关于成员函数的元数据。

PySide6.QtCore.QMetaEnum

QMetaEnum 类提供了关于枚举器的元数据。

PySide6.QtCore.QMetaProperty

QMetaProperty 类提供了关于属性的元数据。

PySide6.QtCore.QMetaClassInfo

QMetaClassInfo 类提供了关于类的额外信息。

PySide6.QtCore.QMetaType

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

PySide6.QtCore.QSignalBlocker

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

PySide6.QtCore.QObject

QObject 类是所有 Qt 对象的基类。

QObjectCleanupHandler

QObjectCleanupHandler 类监视多个 QObject 的生命周期。

QPointer

QPointer 类是一个模板类,提供对 QObject 的保护指针。

PySide6.QtCore.QSignalMapper

QSignalMapper 类将来自可识别发送者的信号捆绑在一起。

PySide6.QtCore.QVariant

QVariant 类充当最常见 Qt 数据类型的联合体。

Qt 对象:身份与值

上面列出的Qt对象模型的一些新增功能要求我们将Qt对象视为身份,而不是值。值被复制或分配;身份被克隆。克隆意味着创建一个新的身份,而不是旧身份的精确副本。例如,双胞胎有不同的身份。他们可能看起来一模一样,但他们有不同的名字,不同的位置,可能有完全不同的社交网络。

然后克隆一个身份比复制或赋值一个值更复杂。我们可以在Qt对象模型中看到这意味着什么。

一个Qt对象…

  • 可能有一个唯一的 objectName()。如果我们复制一个Qt对象,我们应该给副本起什么名字?

  • 对象层次结构中有一个位置。如果我们复制一个Qt对象,复制品应该放在哪里?

  • 可以连接到其他Qt对象,向它们发出信号或接收它们发出的信号。如果我们复制一个Qt对象,我们应该如何将这些连接转移到副本中?

  • 可以在运行时添加未在C++类中声明的新属性。如果我们复制一个Qt对象,副本是否应该包括添加到原始对象的属性?

出于这些原因,Qt 对象应被视为身份,而不是值。身份是克隆的,而不是复制或分配的,克隆身份比复制或分配值更复杂。因此,QObject 和所有 QObject 的子类(直接或间接)都禁用了它们的 copy constructor and assignment operator