从Qt 4到Qt 5(二)Qt 5框架介绍
导语
上一节已经安装好Qt 5.2,并将一个Qt 4程序迁移到了Qt 5上。其中我们讲到Qt 5中QApplication
类已经不在QtGui模块中了,而且所有的Qt 5图形界面程序都必须在.pro
项目文件中添加widgets
模块。那么到底Qt 5中对模块进行了哪些改动,Qt 5的框架又是怎样的?这一节将和大家一起看一下这些内容。
环境:Windows 7 + Qt 5.2.0+QtCreator 3.0
目录
- 一、在帮助中查看所有模块
- 二、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 Por
t、还有出现在商业版中的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
的基础。
四、QtQml
和QtQuick
框架
如果要问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 4到Qt 5,整个框架进行了优化调整,目的就是为了达到更好的性能和以后进一步地扩展。可以发现,OpenGL和WebKit在整个框架中占有举足轻重的地位,不过在不远将来的Qt 5.3,Chromium将代替WebKit成为Qt的Web引擎,因为Chromium提供了更好的跨平台性和其他一些易用性。