Qt 中的对象模型(Object Model)
原标题:Qt 中的对象模型(Object Model)90不太后,余生皆折腾 本节内容主要讲了 Qt 对象模型比标准 C++ 对象模型多了什么内容,并介绍了组成 Qt 对象模型基础的相关的类。最后说明了为啥 QObject 作为参数时,几乎都用指针形式的原因。更多内容可参考官方文档 Object Model。
我们使用的标准 C++,其设计的对象模型虽然已经提供了非常高效的 RTTI 支持,但是在某些方面还是不够灵活。比如在 GUI 编程方面,既需要高效的运行效率也需要强大的灵活性,诸如删除某窗口时可不想把子窗口用代码一个个去析构。Qt 将这两者的优点完美的结合在了一起,创造出了特有的对象模型(Qt Object Model)。
利用这个对象模型,Qt 语言可比 C++ 提供了更多的功能,使用起来相当的方便。那么只有 Qt 有而 C++ 没有的特性有:方便两个对象间交互的“信号-槽”机制非常灵活好用的“对象属性系统”可以使用强大的“事件及事件过滤”可以国际化翻译字符串可以在 GUI 编程中用 Qt 提供的“计时器”完成许多任务以一种自然的方式组织对象父子关系的“对象树”当引用对象被销毁时会自动设为0的指针(主要是 QPointer),而 C++ 指针销毁时将成为悬空指针Qt 对象之间的动态转换支持可以自定义创建一个 Qt 类型,从而享受 Qt 的其他特性
在继承 QObject 类的基础上,一些 Qt 特性是用 C++ 实现的,一些 Qt 特性(如信号槽、对象属性)是依靠 Qt 的元对象系统以及 moc工具 实现。
其实,相比 C++ 来说,最大的优点就是元对象系统,真是太强大了。和对象模型相关的类
以下类构成了 Qt 对象模型的基础。
QObject 的特殊性
上文提到的新增特性,我们需要将 Qt 对象视为 ID,而不是数值。数值被复制后还是原来的值,ID 被复制了需要指定新的唯一标识。举个生活中的例子就是,双胞胎的数值一样,但是 ID 不同。
禁用拷贝构造函数、禁用赋值运算符
分配新的 ID 可比赋值要复杂的多,我们可以看下这对于 Qt 来说意味着什么:Qt 对象有唯一的 QObject::objectName(),复制一个 Qt 对象我们需要起个什么新名字呢?Qt 对象在对象树中有一个位置,被复制后副本放在哪个层次的哪个位置?Qt 对象被复制后,原有的信号槽连接如何转移到副本?Qt 对象被复制后,运行时的副本是否包含新增加的属性值?
所以QObject及其子类都禁用了复制构造函数和赋值运算符。
不能用复制构造函数示例,错误示范:QObjectx;QObjecty(x);
不能用赋值运算符示例,错误示范:QObject x;QObject y; y = x;
编程中的影响
这样做的结果就是,开发者在某些场景下需要使用 QObject 作为“值”时,必须使用指针传递,而不能用值传递。
我们知道在各种容器中能以value方式存放的类型,必须有默认的构造函数,拷贝构造函数和赋值操作。由于 QObject 及子类不能拷贝和赋值,当我们使用 QList<QObject> 时,编译器就会报错。如果我们要在容器中存储这中类型的对象,我们就要使用它们的指针。如 QList<QObject *>。
最新文章
- 帆软报表FineReport2016年1月份产品更新一览
- Win10 Migrate apps to the Universal Windows Platform (UWP)
- HDU1005
- MVC Form异步请求
- Junit使用GroboUtils进行多线程测试
- spring mvc配置文件dispatcher-servlet.xml详解
- Spring Boot 2 Swagger2
- 【BZOJ】【2940】【POI2000】条纹
- Linux内核结构分析与移植
- Linux简介(好!)
- python-面向对象(二)
- Django : Table &#39;MyDjango.django_admin_log&#39; doesn&#39;t exist
- 第三届蓝桥杯C++本科B组决赛解题报告(更新中)
- ACM经典算法之字符串处理:字符串替换
- little bird
- JavaScript 数组最大值
- java ee 思维导图
- ARM指令学习
- mysql \c 终止 mysql输入语句模式
- Spring Boot 揭秘与实战(五) 服务器篇 - Tomcat 启用 HTTPS
热门文章
- gitlab及jenkins
- [dev][nginx] 在阅读nginx代码之前都需要准备什么
- rpm与yum软件管理
- (Linux基础学习)第一章:科普和Linux系统安装
- java读取excel的内容(可保存到数据库中)
- LG5325 【模板】Min_25筛
- (java)selenium webdriver学习--通过id、name定位,输入内容,搜索,关闭操作、通过tagname查找元素
- c++的动态绑定和静态绑定及多态的实现原理(摘)
- spring boot 集成 redis lettuce(jedis)
- 实现自定义集合的可枚举类型(IEnumerable)和枚举数(IEnumerator )