Qt学习入门
Qt的整体框架
Qt作为一个GUI的解决方案,其被设计为基于面向对象,跨平台,并直接与底层接口的framework,下图为主要的层次结构:
下边将从对象模型,事件机制,通信机制,定时器,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记录了所有注册过的属性信息,允许程序在编译时不知情的一些信息,在实时运行阶段能够动态添加进来。
相当于一个盒子,假设我是盒子的设计者,我并不知道将来盒子里要放什么东西,设计的要求是,我可以放新的东西进来也可以添加已有的东西,也可以将盒子更改我自定义的样式。