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. CentOS上搭建java WEB开发环境Tomcat+MySQL+JDK

    对于初学者来说,想在linux系统上搭建一个java web服务器,不知道什么方案可行, 这篇文章主要是告诉这些基础和概念相对薄弱的同学,这样搭建是可行的,大体上没问 题的,出问题也是细节问题.所以此 ...

  2. linux挂载分区

    [root@localhost ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/xvda2 36G .3G 32G % / tmpf ...

  3. 编译linux内核时出错

    在编译linux内核的时候使用make menuconfig 可能出现下面的错误 *** Unable to find the ncurses libraries or the*** required ...

  4. WCF 学习笔记之异常处理

    WCF 学习笔记之异常处理 1:WCF异常在配置文件 <configuration> <system.serviceModel> <behaviors> <s ...

  5. enode框架step by step之Staged event-driven architecture思想的运用

    enode框架step by step之Staged event-driven architecture思想的运用 enode框架系列step by step文章系列索引: 分享一个基于DDD以及事件 ...

  6. [分享]CSS美化浏览器滚动条

    今天看到一个站点的滚动条样式特别漂亮,顺便上网搜了一些相关资料,分享给大家: PS:兼容所有浏览器的滚动条样式目前是不存在的. IE下的滚动条样式 IE是最早提供滚动条的样式支持,好多年了,但是其它浏 ...

  7. Objective-C之run loop详解

    Objective-C之run loop详解 做了一年多的IOS开发,对IOS和Objective-C深层次的了解还十分有限,大多还停留在会用API的级别,这是件挺可悲的事情.想学好一门语言还是需要深 ...

  8. 异常:failed for object com.sdu.crm.pojo.Customer@136a986 [java.lang.NullPointerException]

    异常: failed for object com.sdu.crm.pojo.Customer@136a986 [java.lang.NullPointerException] 大家好,如果大家看到了 ...

  9. 【实用技巧】去除BootStrap所有圆角效果

    满屏的圆角有没有审"美"疲劳啊?教你一键去除所有圆角效果: * { -webkit-border-radius: 0 !important; -moz-border-radius: ...

  10. Java(多)线程中注入Spring的Bean

    问题说明 今天在web应用中用到了Java多线程的技术来并发处理一些业务,但在执行时一直会报NullPointerException的错误,问题定位了一下发现是线程中的Spring bean没有被注入 ...