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 *>。
Qt 中的对象模型(Object Model)的更多相关文章
- Qt中如何写一个model
在qt中,用到最多就是model/view的结构来表示数据层及表示层的关系.model用于给view提供数据.那如何来实现一个简单的树形model呢. 实现一个自己的model需要重载以下的方法: Q ...
- Qt中如何写一个model(自定义一个RowNode,我没有碰到过)
在qt中,用到最多就是model/view的结构来表示数据层及表示层的关系.model用于给view提供数据.那如何来实现一个简单的树形model呢. 实现一个自己的model需要重载以下的方法: Q ...
- 在c++中使用Outlook Object Model发送邮件
一.Outlook Object Model简介 Outlook Object Model(OOM)是outlook为开发者提供的一个COM组件,我们可以在程序中使用它来发送邮件.管理邮箱等.相关介绍 ...
- QT中的对象模型――QPointer
QPointer是一个模板类,为QObject对象提供了守卫指针(Guarded Pointer).什么是守卫指针?守卫指针QPointer<T>类似于普通C++指针T *,有且仅有一点不 ...
- BOM (Browser Object Model) 浏览器对象模型
l对象的角色,因此所有在全局作用域中声明的变量/函数都会变成window对象的属性和方法; // PS:尝试访问未声明的变量会抛出错误,但是通过查询window对象,可以知道某个可能未声明的对象是否存 ...
- 文本对象模型(Document Object Model)
本文内容: 1. 概述 2. DOM中的节点类型 3. DOM节点的选取 4. 存取元素属性 5.DOM元素的增删 6.小结 ★ 概述 文本对象模型(DOM)是一个能够让程序和脚本动态访问和更新文档内 ...
- 浏览器对象模型(BOM,Browser Object Model)
本文内容 1.概述 2.windows与document 3.对话框 4.定时调用 5.URL解析与访问历史 6.浏览器和屏幕信息 ★概述 &q ...
- 浏览器对象模型BOM(Browser Object Model)
1.结构 BOM是Browser Object Model的缩写,简称浏览器对象模型 BOM提供了独立于内容而与浏览器窗口进行交互的对象 由于BOM主要用于管理窗口与窗口之间的通讯,因此其核心对象是w ...
- javascript快速入门之BOM模型—浏览器对象模型(Browser Object Model)
什么是BOM? BOM是Browser Object Model的缩写,简称浏览器对象模型 BOM提供了独立于内容而与浏览器窗口进行交互的对象 由于BOM主要用于管理窗口与窗口之间的通讯,因此其核心对 ...
随机推荐
- CSS3 颜色渐变、阴影、渐变的阴影
css阴影: 外阴影:box-shadow:X Y Npx #color; 内阴影:box-shadow:inset X Y Npx #color; 文字阴影:text-shadow:X Y Npx ...
- event.target事件
event.target <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- 汽车电子测试项目管理系统-TPA
概述 INTEWORK-TPA(Test Project Administrator, 以下简称TPA) 是一款集成的测试项目管理工具,它可以管理测试过程中的所有数据,包括需求.用例.样件.计划.报告 ...
- P1311 选择客栈[模拟]
题目描述 丽江河边有nn家很有特色的客栈,客栈按照其位置顺序从 11到nn编号.每家客栈都按照某一种色调进行装饰(总共 kk 种,用整数 00 ~k-1k−1 表示),且每家客栈都设有一家咖啡店,每家 ...
- window下关闭占用端口使用
怎么在window下关闭端口! 1:查看特定端口被占用情况 命令: netstat -ano 和 netstat -ano|findstr 端口号 netstat -ano:查看电脑所有端口被占用 ...
- JVM那些事儿之内存区域
相信绝大多数java开发者或多或少的都应该知道jvm,但是有多少人又深入去了解过,笔者深感自身能力的不足,去看了些资料,觉得还是有必要整理下自己的学习记录,时常回头看看,多看多实践提升自己的能力,故开 ...
- POJ3709 K-Anonymous Sequence
题意 Language:Default K-Anonymous Sequence Time Limit: 4000MS Memory Limit: 65536K Total Submissions: ...
- Idea导入maven项目
1.idea中有项目的关闭项目 File>>close project 回到截图 下一步>下一步
- jquery中ajax跨域加载
今天学习ajax跨域加载,先来一段代码,异步加载的链接是爱奇艺的开源,我直接拿来用作测试 <!DOCTYPE html> <html lang="en"> ...
- (转载) 从0开始搭建SQL Server AlwaysOn 第一篇(配置域控)
安装完之后别忘了还需要安装SSMS,这是坑爹的地方之二,干嘛不集成到SQL Server安装包里还要用户自己单独下载 下载地址:https://msdn.microsoft.com/en-us/lib ...