原标题: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. 7. Input and Output

    7. Input and Output There are several ways to present the output of a program; data can be printed i ...

  2. P1801 黑匣子[堆]

    题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命令只有两种: ...

  3. Excel条件格式的8大用法

    1.显示重复值 选中数据区域——开始——条件格式——突出显示单元格规则——重复值——设置格式. 操作演示: 2.利用数据条展示数据 选中数据区域——开始——条件格式——数据条. 操作演示: 3.利用色 ...

  4. Python读取csv内容

    #encoding:utf-8 import csv csv_file=csv.reader(open("d://wu.csv","r"))print(csv_ ...

  5. Enterprise Architect 14破解版 安装包 安装教程

    安装包以及破解补丁下载: 链接:https://pan.baidu.com/s/1es0wN_6-d9pk4xnSN1SiFA 提取码:bor0 安装包链接失效可在下方留言 安装以及破解教程 参考链接 ...

  6. 08 node.js 的使用

    创建包 目录结构 cmd   cd 到当前目录:  \ 执行 npm init //创建一个包 1 2. 3. 4.包的安装 npm install jquery --save npm install ...

  7. 配置Sublime,为了Python

    E:\Sublime Text 3\Data\Packages\User\untitled.sublime-build { "cmd": ["C:\Program Fil ...

  8. vs 在高分屏下开发 winform 配置

    一.窗体控件大小 第一种方法:使用网格避免整除误差 在选项中将Windows窗体设计器的LayoutMode(布局模式)改成SnapToGrid(对齐到网格),并将Default Grid Cell ...

  9. greenplum 表在各个节点数据的分布情况

    select gp_segment_id,count(*) from table_name group by gp_segment_id;

  10. C int类型的数组在内存中的地址示例

    #include <stdio.h> int main(void){ int age[5] = {5,6,7,20,99}; return 0; } //转换后 /*(gdb) p &am ...