[Qt教程] 第52篇 从Qt 4到Qt 5(二)Qt 5框架介绍


该文章原创于Qter开源社区(www.qter.org),作者yafeilinux,转载请注明出处!

转载自:点击打开链接http://bbs.qter.org/forum.php?mod=viewthread&tid=934&extra=page%3D1


导语

        上一节已经安装好 Qt 5.2 ,并将一个 Qt 4 程序迁移到了 Qt 5 上。其中我们讲到 Qt 5 QApplication 类已经不在 QtGui 模块中了,而且所有的 Qt 5 图形界面程序都必须在 .pro 项目文件中添加 widgets 模块。那么到底 Qt 5 中对模块进行了哪些改动, Qt 5 的框架又是怎样的?这一节将和大家一起看一下这些内容。


目录


一、在帮助中查看所有模块
二、Qt 基本模块框架
三、图形界面库框架
四、QtQml QtQuick 框架




正文


一、在帮助中查看所有模块


        打开Qt Creator ,进入其帮助模式,然后选择目录方式进行查看,打开“Qt 5.2.0ReferenceDocumentation ”页面。在这里提供了Qt5.2 的整体介绍,并将其所有内容进行了分类。我们选择右下角的“All Qt Modules ”来查看所有的Qt 模块。如下图所示。




        在所有模块页面,将Qt 的模块分为了三部分:Qt  基本模块(Qt Essentials )、Qt 扩展模块(Qt Add-Ons )和Qt 工具(Qt Tools )。Qt 基本模块中包含了Qt 核心基础的功能,这个我们会在后面详细讲解;而Qt 扩展模块包含了以前QtMobility 中的一些与移动有关的模块,如蓝牙QtBluetooth 、传感器QtSensors 等。还包含了以前Qt 4 中的一些模块,例如QtDBus QtXML QtScript 等。 除此之外,还新添了一些模块,例如图形效果QtGraphicalEffects 、串口Qt Serial Port 、还有出现在商业版中的Qt3D 等。这些模块都是有特殊用途的,它们很多需要在特殊的平台上才可使用。在扩展模块中我们也看到了Qt Print Support 打印支持模块,它是以前很多类的重组模块;在Qt 工具中包含了Qt 设计器、Qt 帮助和Qt 界面工具三部分内容。如下图所示。





二、Qt基本模块框架


       Qt 基本模块中定义了适用于所有平台的Qt 基础功能,在大多数Qt 应用程序中需要使用该模块中的提供的功能。Qt 基本模块的底层是QtCore 模块,其他所有模块都依赖于该模块,这也是为什么我们总可以在.pro 文件中看到QT += core 的原因了。整个基本模块的框架如下图所示。





        最底层的是QtCore ,它提供了元对象系统、对象树、信号槽、线程、输入输出、资源系统、容器、动画框架、JSON 支持、状态机框架、插件系统、事件系统等等所有基础功能。该模块的重要性不言而喻。在其之上,直接依赖于QtCore 的是QtTest QtSql QtNetwork QtGui 四个模块,其中测试模块QtTest 和数据库模块QtSql 是相对独立的,而更加重要的是网络模块QtNetwork 和图形模块QtGui ,在它们两个之上便是Qt 5 的重要更新部分QtQml QtQuick 。而最上层的是新添加的QtMultiMedia 多媒体模块,和在其之上的QtWebKit 模块。

        对于整个框架,大家可以理解为下层模块为上层模块提供支持,或者说上层模块包含下层模块的功能。举个例子,例如QtWebKit 模块,它既有图形界面部件也支持网络功能,还支持多媒体应用。对于其他模块,我们这里就不再深入介绍,下面主要来讲解一下其中最重要的QtGui 模块。



三、图形界面库框架


        现在再回到开头的问题,我们已经发现QApplication 不在QtGui 模块中了,其实不仅如此,就连所有用户界面的基类QWidget 也不在QtGui 模块中了,它们被重新组合到了一个新的模块QtWidgets 中。Qt 5 的一个重大更改就是重新定义了QtGui 模块,它不再是一个大而全的图形界面类库,而是为GUI 图形用户界面组件提供基类,包括了窗口系统集成、事件处理、OpenGL OpenGL ES 集成、2D 绘图、基本图像、字体和文本等内容。在Qt 5 中将以前QtGui 模块中的图形部件类移动到了QtWidgets 模块中,将打印相关类移动到了Qt Print Support 模块中。不过Qt 5 中去掉了QtOpenGL 模块,而将OpenGL 相关类移动到了QtGui 模块中。有的读者可能发现在Qt 扩展模块中依然有QtOpenGL 模块,其实它只是为了便于Qt 4 Qt 5 移植才保留的,在编写Qt 5 程序时依然强烈推荐使用QtGui 模块中的OpenGL 类。了解了图形库的大体更改,下面我们来看一下Qt 图形界面库的整体框架。如下图所示。






        在各种支持的平台之上是底层的平台抽象层QPA ,这个就是被称作LightHouse 的灯塔项目,它是Qt 可以无处不在的基础。而在其上的所有蓝色组块都是QtGui 模块的内容,它们被分为了两类,一类以OpenGL 为核心,它是现在最新的QtQuick2 QtWebkit 的基础;一类是以辅助访问和输入方式为基础的一般图形显示类,它们是经典QWidget 部件类和QtQuick1 的基础。



四、QtQmlQtQuick框架


        如果要问Qt 5 最大的更新和特色是什么,那非QtQml QtQuick 莫属。其实,在Qt 4.7 的时候就已经有QtQuick 了,不过它在那个时候并不成熟。只有到现在的Qt 5 qml quick 才发展壮大,逐渐规范起来,并且拥有了与QWidget 平分秋色的地位。大家可能已经了解到,qml quick 是为移动设备而生的,并且是今后Qt 发展的方向。

QtQuick在Qt 4中是这样定义的:Qt Quick 是一种高级用户界面技术,使用它可轻松地创建供移动和嵌入式设备使用的动态触摸式界面和轻量级应用程序。三种全新的技术共同构成了 Qt Quick 用户界面创建工具包:一个改进的Qt Creator IDE、一种新增的简便易学的语言 (QML) 和一个新加入 Qt 库中名为QtDeclarative 的模块,这些使得 Qt 更加便于不熟悉 C++ 的开发人员和设计人员使用。

不过在Qt 5中将以前的QtQuick分为了两大部分: 一部分是QtQml,它提供了一个QML语言框架,定义并实现了语言引擎基础,还提供了便于开发者使用的API,实现使用自定义类型来扩展QML语言以及将JavaScript和C++集成到QML代码中。另一部分是新的QtQuick,它是一个用于编写QML程序的标准库,它提供了使用QML创建用户界面程序时需要的所有基本类型。

在Qt 5中已经很明了地分离了qml和quick,使得我们可以对这项新技术拥有更加清楚地认识。与其说这是一项新技术,不如说这是Qt创造的一个新的语言和类库,请允许在这里打个不太科学的比方:qml就好比是C++语言,那么quick就是Qt库,Qt库是用C++语言编写的一个类库,而quick就是用qml语言编写的一个类库,只不过在qml的世界里,没有类这个叫法而已。

QtQml和QtQuick的框架如下图所示。





        可以看到QtQml QtQuick 是独立的两部分: QtQml QtCore 为基础,拥有QtNetwork 的相关功能,然后搭建在了V8 V4 两个JavaScript 引擎上,V8 大家应该已经熟知了,而V4 是一个轻量级的JavaScript 引擎。不过这里需要提及一下,在最新的Qt 5.2 版本中,V8 已经完全被一个新的Qt 专有引擎代替了,原因是V8 适用于浏览器却不太适用于qml 。我们也可以看到QtQml 本身并没有涉及图形显示的内容;QtQuick QPA 为基础,而后经过了QtGui OpenGL Scene graph 三层封装,这里可以看到,新的QtQuick 是建立在OpenGL 之上的,并且使用了新的Scene graph 进行图形渲染。很明显,QtQuick 就是用于图形显示的。



结语


         Qt 4Qt 5,整个框架进行了优化调整,目的就是为了达到更好的性能和以后进一步地扩展。可以发现,OpenGLWebKit在整个框架中占有举足轻重的地位,不过在不远将来的Qt 5.3Chromium将代替WebKit成为QtWeb引擎,因为Chromium提供了更好的跨平台性和其他一些易用性。


你可能感兴趣的:(Linux,Qt,qtcreator,开源社区,库,qt5,gui)