QT对象模型

概念

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

Qt将这些功能添加到C++中:

  1. 一个非常强大的无缝对象通信机制-信号、槽
  2. 可查询和可设计的对象属性
  3. 强大的事件和事件过滤
  4. 用于国际化的上下文字符串转换
  5. 复杂的间隔驱动计时器,可以在事件驱动的GUI中优雅地集成许多任务(Timers | Qt Core 5.15.17
  6. 分层和可查询的对象树,以自然的方式组织对象所有权(Object Trees & Ownership | Qt Core 5.15.17
  7. 保护指针(QPointer),当引用的对象被销毁时自动设置为0,不像普通的c++指针在其对象被销毁时变成悬空指针(QPointer Class | Qt Core 5.15.17)
  8. 跨库边界工作的动态强制转换(元对象系统-CSDN博客)
  9. 支持自定义类型创建。(Creating Custom Qt Types | Qt Core 5.15.17)

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

元对象系统是一个c++扩展,它使该语言更适合于真正的组件GUI编程。

和对象模型有关的类:

Qt对象:身份 vs 值
上面列出的Qt对象模型的一些附加功能要求我们将Qt对象视为身份,而不是值。值被复制或赋值;克隆身份。克隆意味着创造一个新的身份,而不是旧身份的精确副本。例如,双胞胎有不同的身份。他们可能看起来一样,但他们有不同的名字,不同的位置,可能有完全不同的社交网络。

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

Qt对象…

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

You can do more

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值