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