Qt QObject模型概述
- 一、概述
- 二、 Qt Object Model 类
- 三、Qt对象: Identities vs Value
一、概述
标准的c++对象模型为对象范式提供了非常高效的运行时支持。但它的静态特性在某些问题领域是不灵活的。图形用户界面编程是一个既需要运行时效率又需要高度灵活性的领域。Qt通过结合c++的速度和Qt对象模型的灵活性提供了这一点。
Qt为c++添加了以下特性。
- 一种非常强大的无缝对象通信机制,称为信号槽
- 可查询和可设计的对象属性
- 强大的事件和事件过滤器
- 用于国际化的上下文字符串翻译
- 复杂的间隔驱动定时器,使在事件驱动的GUI中优雅地集成许多任务成为可能
- 层次化和可查询的对象树,以自然的方式组织对象所有权
- 当被引用的对象被销毁时,保护指针(QPointer)自动设置为0,不像普通的c++指针在其对象被销毁时成为悬空指针
跨库边界工作的动态类型转换。 - 支持自定义类型创建。
Qt的许多特性都是基于QObject的继承,用标准c++技术实现的。其他的,如对象通信机制和动态属性系统,则需要Qt自己的元对象编译器(Meta-Object Compiler, moc)提供的元对象系统。
元对象系统是一个c++扩展,它使语言更适合于真正的组件GUI编程。
二、 Qt Object Model 类
Qt 支持的常用的 对象模型的 类
类 | 含义 |
---|---|
QMetaClassInfo | 关于类的附加信息 |
QMetaEnum | 关于枚举器的元数据 |
QMetaMethod | 关于成员函数的元数据 |
QMetaObject | 包含有关Qt对象的元信息 |
QMetaProperty | 关于属性的元数据 |
QMetaType | 管理元对象系统中的命名类型 |
QObject | 所有Qt对象的基类 |
QObjectCleanupHandler | 监视多个qobject的生命周期 |
QPointer | 模板类,提供了指向QObject的守护指针 |
QSignalBlocker | 围绕QObject::blockSignals()的异常安全包装器 |
QSignalMapper | 捆绑来自可识别发送者的信号 |
QVariant | 类似于最常见Qt数据类型的union |
三、Qt对象: Identities vs Value
上面为Qt对象模型列出的一些新增特性要求我们将Qt对象视为 identities,而不是Value。
Value被复制或赋值;identities是克隆的。克隆意味着创建一个新的identities,而不是旧identities的精确复制。
例如,双胞胎有不同的identities。他们可能看起来一模一样,但他们有不同的名字,不同的地点,可能拥有完全不同的社交网络。
那么,克隆标识是一个比复制或赋值更复杂的操作。我们可以在Qt对象模型中看到这意味着什么。
意味着一个Qt对象
- 可能有一个唯一的QObject::objectName()。如果我们复制一个Qt对象,我们应该给它起什么名字?
- 在对象层次中有一个位置。如果我们复制一个Qt对象,它应该位于哪里?
- 可以连接到其他Qt对象,向它们发出信号或接收它们发出的信号。如果我们复制一个Qt对象,我们应该如何将这些连接传输到副本?
- 可以在运行时添加在c++类中未声明的新属性。如果我们复制一个Qt对象,这个副本应该包含添加到原始对象上的属性吗?
出于这些原因,Qt对象应该被视为Identities ,而不是Value。Identities 是克隆的,而不是复制或赋值的,而且克隆Identities 是比复制或赋值更复杂的操作。因此,QObject和QObject的所有子类(直接或间接)都禁用了复制构造函数和赋值运算符。