对象模型#
Qt动态对象模型所能提供强大功能的描述。
标准的C++对象模型为对象范式提供了非常高效的运行时支持。但它在某些问题领域中的静态性质是不灵活的。图形用户界面编程既需要运行时效率,也需要非常高层次的灵活性。Qt通过将C++的速度与Qt对象模型的灵活性相结合,提供了这一点。
Qt向C++增加了以下特性:
许多这些Qt功能是通过基于QObject
继承的标准的C++技术实现的。其他的一些,比如对象通信机制和动态属性系统,需要Qt自带的元对象编译器(moc)提供的元对象系统。
元对象系统是C++的一个扩展,使得语言更适合真正的组件GUI编程。
重要类#
这些类构成了Qt对象模型的基础。
QMetaSequence
QMetaSequence类允许类型擦除的访问顺序容器。
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对象模型中看看这意味着什么。
A Qt Object…
可能有一个唯一的
objectName()
属性。如果我们复制一个Qt对象,我们应该给复制品赋予什么名字?在对象层次结构中有一个位置。如果我们复制一个Qt对象,该复制品应该放在哪里?
可以将它连接到其他Qt对象,向它们发出信号或接收它们发出的信号。如果我们复制一个Qt对象,我们应如何将连接转移到复制品?
在运行时可以向它添加未在C++类中声明的新属性。如果我们复制Qt对象,复制应该包含原对象添加的属性吗?
出于这些原因,Qt对象应该被视为标识符,而不是值。标识符是被克隆的,而不是复制或分配的,克隆一个标识符的操作比复制或分配值复杂得多。因此,QObject
及其所有子类(直接或间接)的复制构造函数和赋值运算符已被禁用。