对象模型¶
描述由Qt的动态对象模型实现的强大功能。
标准的C++对象模型为对象范式提供了非常高效的运行时支持。但其静态特性在某些问题领域中不够灵活。图形用户界面编程是一个既需要运行时效率又需要高度灵活性的领域。Qt通过将C++的速度与Qt对象模型的灵活性相结合,提供了这一点。
Qt 为 C++ 添加了以下功能:
许多这些Qt功能是通过标准的C++技术实现的,基于从QObject
的继承。其他功能,如对象通信机制和动态属性系统,则需要Qt自己的元对象编译器(moc)提供的元对象系统。
元对象系统是一个C++扩展,使语言更适合真正的组件GUI编程。
重要类¶
这些类构成了Qt对象模型的基础。
QMetaSequence
QMetaSequence 类允许对顺序容器进行类型擦除访问。
QMetaContainer
QMetaContainer 类为顺序容器和关联容器提供了通用功能。
QMetaObject 类包含有关 Qt 对象的元信息。
QMetaMethod 类提供了关于成员函数的元数据。
QMetaEnum 类提供了关于枚举器的元数据。
QMetaProperty 类提供了关于属性的元数据。
QMetaClassInfo 类提供了关于类的额外信息。
QMetaType 类管理元对象系统中的命名类型。
QObject::blockSignals() 的异常安全包装器。
QObject 类是所有 Qt 对象的基类。
QObjectCleanupHandler
QObjectCleanupHandler 类监视多个 QObject 的生命周期。
QPointer
QPointer 类是一个模板类,提供对 QObject 的保护指针。
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
。