Qt-对象模型(翻译)

翻译信息

本文翻译自 Qt6 官方文档 Object Model

译文原文:https://muzing.top/posts/c6731fe8/

协议:本翻译遵守原文档使用的 GFDLv1.3 授权

译者:muzing

翻译时间:2022.06


标准 C++ 对象模型为对象范例提供了非常有效的运行时支持。但它的静态性质在某些具体问题领域不够灵活。GUI 编程是一个需要运行时效率和高灵活性的领域。Qt 通过将 C++ 的速度与 Qt 对象模型的灵活性相结合,来实现这一点。

Qt 为 C++ 添加了如下特性:

这些 Qt 特性中的许多是基于从 QObject 的继承,用标准 C++ 技术实现。其他的,比如对象通信机制和动态属性系统,需要由 Qt 自带的元对象编译器(moc)提供的元对象系统

元对象系统是一种 C++ 扩展,使得该语言更适合真正的组件 GUI 编程。

重要的类

这些类构成了 Qt 对象模型的基础。

QMetaClassInfo关于类的附加信息
QMetaEnum关于枚举器的元数据
QMetaMethod关于成员函数的元数据
QMetaObject包含有关 Qt 对象的元信息
QMetaProperty关于属性的元数据
QMetaSequence允许对顺序容器进行类型擦除访问
QMetaType管理元对象系统中的具名类型
QObject所有 Qt 对象的基类
QObjectCleanupHandler监视多个 QObject 的生命周期
QPointer模板类,提供受保护的指向 QObject 的指针
QSignalBlocker包裹 QObject::blockSignals() 的异常安全包装器
QSignalMapper绑定来自可识别发送者的信号
QVariant行为类似于最常见的 Qt 数据类型的集合

Qt 对象:身份?值?

上面列出的 Qt 对象模型的一些附加功能要求我们将 Qt 对象视为身份(identities),而不是值(values)。值被复制或分配,身份被克隆。克隆意味着创建一个新的身份,而不是旧身份的精确复制品。例如,双胞胎有不同的身份。他们可能看起来相同,但名称不同、位置不同,并且可能有完全不同的社交圈子。

克隆身份是比复制或分配更复杂的操作。我们可以在 Qt 对象模型中看到这意味着什么。

一个 Qt 对象……

  • 可能有一个唯一的 QObject::objectName()。如果我们复制一个 Qt 对象,该给这个副本起什么名字呢?
  • 对象层次结构中占据一个位置。如果我们复制一个 Qt 对象,副本应该放在哪里?
  • 可以连接到其他 Qt 对象以向它们发出信号或接收它们发出的信号。如果我们复制一个 Qt 对象,该如何将这些连接转移到副本中呢?
  • 可以在运行时添加未在 C++ 类中声明的新属性。如果我们复制一个 Qt 对象,副本是否应该包括添加到原始对象的属性?

出于这些原因,Qt 对象应该被视为身份而不是值。身份是克隆的,而不是复制或分配的,克隆身份是比复制或分配值更复杂的操作。因此,QObject 及其所有直接或间接继承的子类,都被禁用了复制构造函数和赋值运算符


© 2022 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值