Object Model 综述

标准 C++ 的对象模型为对象的动态特性提供了运行时的支持。 但是它静态的本性决定了在某些领域它表现出僵化、不可扩展的特点。 GUI编程就是一个既需要运行时编译的效率, 也需要极大的灵活性的一个领域。 Qt 通过整合C++的效率和Qt Object Model的灵活性解决了这个问题。

Qt 为 C++ 增加了这些特性:

  • Signal and Slots  Signal and Slots 提供了对象之间的无缝通信

  • Object Properties 可查询、可识别的对象特性

  • contextual string translation for internationalization    上下文相关的字符串翻译(国际化)

  • Events and event filter 提供了强大的事件机制。

  • Timers  复杂的内部计时器可以简练的在事件驱动的GUI中加入许多任务。

  • 可继承、可查询的对象树合理的管理对象的附属关系

Guarded Pointers(QPointer) 在对象删除以后自动设为0, 相比之下,C++的指针会在对象删除后悬空。

这些特性中大部分是通过 C++ 的技术实现的, 主要是通过继承 QObject 来获取。 而 Signal and Slots   以及 Object Properties  则通过 Meta-Object System 实现。

Qt 是c++的有效扩展, 虽然模板也可以用于扩展C++, 但是 Meta-Object System 提供了许多模板+标准C++ 无法实现的特性。 参照: Why Doesn't Qt Use Templates for Signals and Slots?

Qt Objects 特性 vs 值

上述Object Model的一些特性需要把 Qt Obejcts看作特性, 而非值。 值能够被复制, 或者赋值, 而特性只能被“克隆”。 克隆表示创建一个新特性, 而不全是复制。 比如, 双胞胎有不同的特性, 他们可能长得很像, 但是他们会有不同的名字, 不同的位置, 可能不同的社交网络。

由此看来, 特性的克隆是比复制要复杂的多的操作。 对于 Object Model 来说, 它包括:

  • QObject::objectName.  如何为新类的objectName 赋值?

  • Object hierarchy (对象继承树)上的位置,如何给新类一个正确的定位?

  • 如何管理连接到其它类的 signal slot?

  • 对于那些没有在C++类中声明的、在运行时添加的property, 如何处理?

可见, Qt Object 是无法进行复制操作的, 因此, Qt 使用宏 Q_DISABLE_COPY 禁止使用 “=” 和 拷贝构造函数。

object model 概述的更多相关文章

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

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

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

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

  3. python's object model

    [python's object model] 1.object.__init__(self[, ...])        如果subclass没有实现__init__,那么python类在实例化的时 ...

  4. 有关BOM(Browser Object Model)的内容

    包括: BOM概述 BOM模型 Window对象(常用属性和方法,窗口的打开,窗口的关闭,模态对话框,定时器) Navigator对象(遍历navigator对象的所有属性,Navigator 对象集 ...

  5. Selenium的PO模式(Page Object Model)[python版]

     Page Object Model 简称POM  普通的测试用例代码: .... #测试用例 def test_login_mail(self): driver = self.driver driv ...

  6. 在C#开发中如何使用Client Object Model客户端代码获得SharePoint 网站、列表的权限情况

    自从人类学会了使用火,烤制的方式替代了人类的消化系统部分功能,从此人类的消化系统更加简单,加速了人脑的进化:自从SharePoint 2010开始有了Client Side Object Model ...

  7. Selenium的PO模式(Page Object Model)|(Selenium Webdriver For Python)

            研究Selenium + python 自动化测试有近两个月了,不能说非常熟练,起码对selenium自动化的执行有了深入的认识. 从最初无结构的代码,到类的使用,方法封装,从原始函数 ...

  8. 解决在使用client object model的时候报“object does not belong to a list”错误

    在查看别人代码的时候,发现了个有意思的问题,使用client object model将一个文件check in 我使用的是如下语句获取file Microsoft.SharePoint.Client ...

  9. Page Object Model (Selenium, Python)

    时间 2015-06-15 00:11:56  Qxf2 blog 原文  http://qxf2.com/blog/page-object-model-selenium-python/ 主题 Sel ...

随机推荐

  1. Android Recovery模式学习体会

        最近在学习Android的Recovery模式,感觉它和Windows的安全模式很相似.两者的工作原理都是只加载少量的系统组件(内核是必须的),使系统运行在最小模式,这样就可以在不影响当前系统 ...

  2. WPF专业编程指南 - DispatcherUnhandledException

    WPF的Application类中有一个事件:DispatcherUnhandledException,在应用程序未对其中的异常加以处理的情况下发生,从而为应用程序把好最后的大门 namespace ...

  3. SQL Server跨网段(跨机房)FTP复制

    SQL Server跨网段(跨机房)FTP复制 2013-09-24 17:53 by 听风吹雨, 273 阅读, 0 评论, 收藏, 编辑 一. 背景 搭建SQL Server复制的时候,如果网络环 ...

  4. FAQ:仓储实现为什么在基础设施层?

    FAQ:仓储实现为什么在基础设施层? 目录 问答部分参考文章 问答部分返回目录 问: 仓储实现为什么在基础设施层? 答: 领域模型包含三种元素:实体.值对象和服务,这三种元素都可以以某种形式使用仓储, ...

  5. ios学习笔记之UIControl解读

    UIControl,相信大家对其并不陌生吧,比如平常最常用的UIButton就是继承自UIControl的.按照惯例,还是先来看看为什么有UIControl这个类?什么时候用到它? 查下文档就可以看到 ...

  6. 基于Hadoop开发网络云盘系统客户端界面设计初稿

    基于Hadoop开发网络云盘系统客户端界面设计初稿 前言: 本文是<基于Hadoop开发网络云盘系统架构设计方案>的第二篇,针对界面原型原本考虑有两个方案:1.类windows模式,文件夹 ...

  7. fancybox关闭弹出窗口parent.$.fancybox.close();

    fancybox弹出窗口右上角会自带一个关闭窗口,并且点击遮罩层也会关闭fancybox 有时我们不需要这样进行关闭,隐藏关闭窗口,并且遮罩层不可点击 在弹出窗口页面加一链接进行关闭使用parent. ...

  8. Pig性能优化

    Pig性能优化 1. 尽早去除无用的数据 MapReduce Job的很大一部分开销在于磁盘IO和数据的网络传输,如果能尽早的去除无用的数据,减少数据量,会提升Pig的性能. 1). 尽早的使用Fil ...

  9. .net中获取图像缩略图的函数GetThumbnailImage

    关于.net中获取图像缩略图的函数GetThumbnailImage的一些认识. 在很多图像软件中,打开一幅图像的时候都会显示其缩略图,在看图软件中这样的需求更为常见.如何快速的获取缩略图的信息并提供 ...

  10. linux下http服务器开发

    linux下http服务器开发 1.mystery引入 1)超文本传输协议(HTTP)是一种应用于分布式.合作式.多媒体信息系统的应用层协议 2)工作原理 1)客户端一台客户机与服务器建立连接后,会发 ...