Qt整体框架浅析(一) -对象模型

最近在焦灼于QT的框架以及其内核,本文作为学习的总结,如果有误,望指正。

首先介绍一下Qt的整体框架,Qt作为一个GUI的解决方案,其被设计为基于面向对象,跨平台,并直接与底层接口的framework,下图为主要的层次结构:

clip_image001

下边将从对象模型,事件机制,通信机制,定时器,Frame,模板,线程以及Qstring这几个方面来作为切入点,尝试去架构描述这个庞大的体系。

1.对象模型

   C++标准中虽然有很多的对实时的对象模型的支持,但其静态的特性,导致其仍然缺乏灵活性,Qt提供了自己的对象模型。

主要包括对象树,对象属性,以及元对象系统等

   1)对象树(Object tree ),由于GUI的设计层次结构比较强,并需要兼顾效率,Qt设计了对象树,并支持了动态类类型转换,其中父对象与子对象相互指向,整体的结构关系相当于一个森林, 父对象与子对象为一对多的关系,并有多个平行的父对象。其中有两点需要注意,首先当父对象析构的时候将析构所有的子对象,如果子对象在栈中或者为全局变量,有可能导致重复析构,程序崩溃(* C++标准中,局部变量析构的顺序是构造过程的逆向 );其次如果事件在发送中将QObject(* QObject作为其最终的基类,源自官方Qt文档中~QObject() )析构,也可能导致多线程调用过程中的崩溃。

   2)对象属性(Object properties ),对象属性是基于元对象系统( Meta-Class system ,信号槽机制 signals and slots 也基于该模块, 在后边的章节将会具体谈),Qt中的Q_PROPORTY(...)宏标记了相关属性信息,将其注册到QMetaObject中,QMetaObject记录了所有注册过的属性信息,允许程序在编译时不知情的一些信息,在实时运行阶段能够动态添加进来。

相当于一个盒子,假设我是盒子的设计者,我并不知道将来盒子里要放什么东西,设计的要求是,我可以放新的东西进来也可以添加已有的东西,也可以将盒子更改我自定义的样式。

   3)元对象系统( meta-class system ),元对象系统负责信号槽机制,实时类型判断,以及对象属性。这个系统依赖于MOC( meta object complier ),MOC“阅读”代码,将所有标记信息读入,整理,来满足上面所述3个方面的应用。

在QObject所属子类中,所有拥有QMetaObject的类都支持反射模式(并不被C++标准支持),但Qt通过MOC间接支持了该设计模式,QMetaObject提供了类的属性以及方法描述信息,下图给出了一个例子

clip_image002

Qt整体框架浅析(二) -信号机制

这一章主要来讨论一下建立在meta-object system 上的信号机制( signals and slots )。

下边简要介绍一下信号机制是如何运作,以及采用信号机制的原因。

如下图所示,信号与槽是多对多的关系,通过connect将信号与槽链接在一起,这样的对应关系维护了指定的函数参数,信号emit后就不再关心是谁来处理,这个是一个单向的过程,不过槽函数可以继续emit信号,从而形成一个环,达到函数级通信的目的。因为信号机制无法返回结果,所以槽函数必须是统一的无返回类型。

   meta-object system维护了一个信号以及对应函数的关系列表,取代了回调函数,当发射信号signal1后,程序通过元对象系统定位到对应的函数,好比如说我有一个储物柜,分为很多的小格子,每个格子都有自己的编号,我现在将记录有格子编号的物品交给管理员,管理员自然就知道将物品放到哪个格子中了。在底层实现方面,meta-object complie( moc )编译期间,生成了专门的CPP文件,扩展meta class,记录函数所在偏移,并记录对应关系表。

整个信号槽机制依赖于MOC,并没有使用C++的模板的泛型编程,Qt在其官网上进行了大篇幅的解释,主要原因虽然效率要比模板稍差,但稳定性,扩展性都要比模板好。

clip_image003

转载于:https://my.oschina.net/xushizhe/blog/318939

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值