对象模型
C++标准对象模型为对象范式提供了非常有效的运行时支持。但它在某些问题域中的静态性质是不灵活的。图形用户界面编程是这样一个领域,它既需要运行效率又需要高度的灵活性。Qt通过结合C++的速度和Qt对象模型的可灵活性,提供了这种支持。
Qt将这些特性添加到C++
- 一个称为信号和槽的非常强大的无缝对象通信机制
- 可查询和可设计的对象属性
- 强大的事件和事件过滤器
- 上下文相关的字符串用于国际化
- 复杂的基于周期的计时器,可以使在事件驱动的GUI中优雅地集成许多任务成为可能
- 分层和可查询的对象树,以自然方式组织对象所有权
- 保护指针(QPointer),当引用的对象被销毁时自动设置为0,与当它们的对象被销毁时成为悬挂指针的常规C++指针不同
- 一个在库边界之间工作的动态类型转换
- 支持创建自定义类型
许多这些Qt特性是用标准C++技术实现的,基于从QObject继承。其他,如对象通信机制和动态属性系统,需要Qt自己提供的元对象系统和相关元对象编译器(moc)。
元对象系统是C++的一个扩展,使语言更适合真正的组件GUI编程。
重要类
这些类是Qt对象模型的基础。
关于类的附加信息 | |
枚举器的元数据 | |
成员函数的元数据 | |
包含Qt对象的元信息 | |
属性的元数据 | |
允许对顺序容器进行去除类型的访问 | |
管理元对象系统中的命名类型 | |
所有Qt对象的基础类 | |
监视多个QObject的生存周期 | |
提供到QObject的受保护指针的模板类 | |
围绕QObject::blockSignals()的异常安全包装器 | |
捆绑来自可识别发送者的信号 | |
对于Qt最常见的数据类型,表现得像一个联合体 |
Qt 对象:标识符与值
上面列出的 Qt 对象模型的一些新增功能需要我们将 Qt 对象视为标识符,而不是值。值可以被复制或赋值;而标识符被克隆。克隆意味着创建一个新的标识符,而不是旧的精确副本。例如,双胞胎具有不同的标识符。他们可能看起来完全相同,但他们有不同的名字,不同的位置,并且可能具有完全不同的社交网络。
因此,克隆一个标识符的操作比复制或赋值值更加复杂。我们可以在 Qt 对象模型中看到这一点。
一个 Qt 对象...
- 可能具有独特的 QObject::objectName。如果我们复制一个 Qt 对象,我们应该给复制的对象起什么名字?
- 在 对象层次结构 中有一个位置。如果我们复制一个 Qt 对象,复制的对象应该位于哪里?
- 可以连接到其他 Qt 对象,向它们发出信号或接收它们发出的信号。如果我们复制一个 Qt 对象,我们应该如何将这些连接转移到副本上?
- 可以在运行时添加 新属性,这些属性未在 C++ 类中声明。如果我们复制一个 Qt 对象,副本是否包含添加到原始对象中的属性?
因此,Qt 对象应该被视为标识符,而不是值。标识符被克隆,而不是复制或赋值,克隆标识符的操作比复制或赋值值更复杂。因此,QObject 及其所有 QObject 的子类(直接或间接)都禁用了它们的 复制构造函数和赋值运算符。
© 2024 Qt 公司。本文档中所包含的文档贡献的版权属于各自的拥有者。本提供的文档是根据自由软件基金会发布的 GNU 自由文档许可证版本 1.3 的条款许可的。Qt 及相关标志是芬兰及/或其他国家 Qt 公司的商标。所有其他商标均为各自所有者的财产。