对象模型#

Qt动态对象模型所能提供强大功能的描述。

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

Qt向C++增加了以下特性:

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

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

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

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

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

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

  • 受保护的指针(QPointer),在被引用的对象被销毁时自动设置为零,而普通的C++指针在被销毁的对象时将成为悬空指针

  • 一种工作在库边界之间的动态转换

  • 支持自定义类型创建。

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

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

重要类#

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

QMetaSequence

QMetaSequence类允许类型擦除的访问顺序容器。

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对象模型中看看这意味着什么。

A Qt Object…

  • 可能有一个唯一的objectName()属性。如果我们复制一个Qt对象,我们应该给复制品赋予什么名字?

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

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

  • 在运行时可以向它添加未在C++类中声明的新属性。如果我们复制Qt对象,复制应该包含原对象添加的属性吗?

出于这些原因,Qt对象应该被视为标识符,而不是值。标识符是被克隆的,而不是复制或分配的,克隆一个标识符的操作比复制或分配值复杂得多。因此,QObject及其所有子类(直接或间接)的复制构造函数和赋值运算符已被禁用。