Qt:对象模型

1059 篇文章 285 订阅

标准C++对象模型为对象范式提供了非常有效的运行时支持,但它的静态性质在某些问题领域是不灵活的。图像用户界面编程是一个既需要运行时效率又需要高度灵活性的领域。通过结合C++的速度和Qt对象模型的灵活性,Qt解决了这个问题。

Qt在C++中添加了如下特性:

  QObject *obj = new MyWidget;
   QWidget *widget = qobject_cast<QWidget *>(obj);
   QLabel *label = qobject_cast<QLabel *>(obj);

很多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对象:Identity vs Value

上面列出的Qt对象模型的一些新增特性要求我们将Qt对象视为身份,而不是值。

  • 值被复制或赋值;
  • 身份是克隆。

克隆意味着创建一个新的身份,而不是旧身份的精确副本。

例如,双胞胎有不同的身份。他们可能看起来一样,但他们有不同的名字,不同的地点,并且可能有完全不同的社交网络。

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

一个Qt对象…

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

由于这些原因,应将Qt对象视为身份,而不是值。身份是克隆的,而不是复制或分配的,克隆身份比复制或分配值要复杂得多。因此,QObject和QObject的所有子类(直接或间接)都禁用了它们的复制构造函数和赋值操作符

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值