原标题: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 *>。

Qt 中的对象模型(Object Model)的更多相关文章

  1. Qt中如何写一个model

    在qt中,用到最多就是model/view的结构来表示数据层及表示层的关系.model用于给view提供数据.那如何来实现一个简单的树形model呢. 实现一个自己的model需要重载以下的方法: Q ...

  2. Qt中如何写一个model(自定义一个RowNode,我没有碰到过)

    在qt中,用到最多就是model/view的结构来表示数据层及表示层的关系.model用于给view提供数据.那如何来实现一个简单的树形model呢. 实现一个自己的model需要重载以下的方法: Q ...

  3. 在c++中使用Outlook Object Model发送邮件

    一.Outlook Object Model简介 Outlook Object Model(OOM)是outlook为开发者提供的一个COM组件,我们可以在程序中使用它来发送邮件.管理邮箱等.相关介绍 ...

  4. QT中的对象模型――QPointer

    QPointer是一个模板类,为QObject对象提供了守卫指针(Guarded Pointer).什么是守卫指针?守卫指针QPointer<T>类似于普通C++指针T *,有且仅有一点不 ...

  5. BOM (Browser Object Model) 浏览器对象模型

    l对象的角色,因此所有在全局作用域中声明的变量/函数都会变成window对象的属性和方法; // PS:尝试访问未声明的变量会抛出错误,但是通过查询window对象,可以知道某个可能未声明的对象是否存 ...

  6. 文本对象模型(Document Object Model)

    本文内容: 1. 概述 2. DOM中的节点类型 3. DOM节点的选取 4. 存取元素属性 5.DOM元素的增删 6.小结 ★ 概述 文本对象模型(DOM)是一个能够让程序和脚本动态访问和更新文档内 ...

  7. 浏览器对象模型(BOM,Browser Object Model)

    本文内容     1.概述     2.windows与document     3.对话框     4.定时调用     5.URL解析与访问历史     6.浏览器和屏幕信息 ★概述     &q ...

  8. 浏览器对象模型BOM(Browser Object Model)

    1.结构 BOM是Browser Object Model的缩写,简称浏览器对象模型 BOM提供了独立于内容而与浏览器窗口进行交互的对象 由于BOM主要用于管理窗口与窗口之间的通讯,因此其核心对象是w ...

  9. javascript快速入门之BOM模型—浏览器对象模型(Browser Object Model)

    什么是BOM? BOM是Browser Object Model的缩写,简称浏览器对象模型 BOM提供了独立于内容而与浏览器窗口进行交互的对象 由于BOM主要用于管理窗口与窗口之间的通讯,因此其核心对 ...

随机推荐

  1. Django异常 - ImportError: No module named django.core.management

    Django错误 - ImportError: No module named django.core.management问题描述:在命令行输入 manage.py runserver,提示找不到d ...

  2. Android笔记(五十七)Android总结:基础篇

    什么是安卓 Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发.目前发行版本是6.0 安卓平台的优势 ...

  3. SHELL脚本编程的条件测试

    SHELL脚本编程的条件测试 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.条件测试概述 判断某需求是否满足,需要由测试机制来实现 专用的测试表达式需要由测试命令辅助完成测试过 ...

  4. Apache的虚拟主机

    一.虚拟主机的分类 基于IP的虚拟主机:一台服务器,多个ip,搭建多个网站 基于端口的虚拟主机:一台服务器,一个ip,利用不同端口,搭建多个网站 基于域名的虚拟主机:一台服务器,一个ip,多个域名,搭 ...

  5. 微信小程序使用本地图片在真机不显示的问题

    最近做的小程序,在真机测试发现有些本地图片在开发工具上可以显示,但是在真机上预览的时候不能显示 代码是这样写的 <view class='seat-size' wx:for="{{it ...

  6. 在springboot项目中使用swaggerui

    在pom.xml文件中配置(用的2.6.1版本,2.9.2有点丑) <properties> <!--<spring.swagger2.version>2.9.2< ...

  7. input图片上传并显示查看判断图片类型

    有一个问题:上传一次在上传一次关闭按钮会出现两次,关闭之后还有一个(改好了可以告诉我我在修正过来) <div id="box"> <div class=" ...

  8. php获取时期时间信息函数

    在正式学习日期函数前大家得了解几个概念: 1.时区 2.世界时 3.unix时间戳 时区 这个概念,之前大家听说过很多.我们来啰嗦两句,我们现实生活中使用的实区,在电脑里面也是一样有规定的.大理石机械 ...

  9. cf 1051F 树+图

    $des$给定一张 $n$ 个点 $m$ 条边的带权无向联通图,$q$ 次询问,每次询问 $u_i$ 到 $v_i$ 的最短路长度.$n,q <= 10^5, m - n <= 20$ $ ...

  10. 洛谷P1650赛马与codevs 2181 田忌赛马

    洛谷P1650 赛马 题目描述 我国历史上有个著名的故事: 那是在2300年以前.齐国的大将军田忌喜欢赛马.他经常和齐王赛马.他和齐王都有三匹马:常规马,上级马,超级马.一共赛三局,每局的胜者可以从负 ...