找回密码
 立即注册
收起左侧

过渡篇 从Qt 4到Qt 5(二)Qt 5框架介绍

19
回复
30150
查看
[复制链接]
累计签到:1568 天
连续签到:1 天
来源: 2013-11-2 11:28:52 显示全部楼层 |阅读模式
Qt 5框架介绍

版权声明

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




导语

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




环境:Windows 7 + Qt 5.2.0+QtCreator 3.0




目录


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




正文


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


       打开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中的一些模块,例如QtDBusQtXMLQtScript等。除此之外,还新添了一些模块,例如图形效果QtGraphicalEffects、串口Qt Serial Port、还有出现在商业版中的Qt3D等。这些模块都是有特殊用途的,它们很多需要在特殊的平台上才可使用。在扩展模块中我们也看到了Qt Print Support打印支持模块,它是以前很多类的重组模块;在Qt工具中包含了Qt设计器、Qt帮助和Qt界面工具三部分内容。如下图所示。





二、Qt基本模块框架


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





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

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



三、图形界面库框架


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






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



四、QtQmlQtQuick框架


       如果要问Qt 5最大的更新和特色是什么,那非QtQmlQtQuick莫属。其实,在Qt 4.7的时候就已经有QtQuick了,不过它在那个时候并不成熟。只有到现在的Qt 5qmlquick才发展壮大,逐渐规范起来,并且拥有了与QWidget平分秋色的地位。大家可能已经了解到,qmlquick是为移动设备而生的,并且是今后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的框架如下图所示。





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



结语


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



返回目录


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

累计签到:3 天
连续签到:1 天
2013-11-3 13:39:41 显示全部楼层
希望尽快推出新的教程!
回复 支持 反对

使用道具 举报

累计签到:3 天
连续签到:1 天
2013-11-5 10:00:51 显示全部楼层
{:soso_e179:}老师辛苦了,期待53期的教程
回复 支持 反对

使用道具 举报

累计签到:29 天
连续签到:1 天
2013-11-14 15:07:08 显示全部楼层
我有个问题,我安装了5.2后运行一个5.1的android程序,但是报了一些问题:Could not read qmake configuration file C:/Qt/Qt5.2.0/5.2.0-beta1/android_arm7/mkspecs/android-g++/qmake.conf.
难道这个还需要我另外配置,但是这个按道理是不需要配置的啊?这是为什么呢?
回复 支持 反对

使用道具 举报

累计签到:1568 天
连续签到:1 天
2013-11-14 15:10:04 显示全部楼层
xueqiang508 发表于 2013-11-14 15:07
我有个问题,我安装了5.2后运行一个5.1的android程序,但是报了一些问题:Could not read qmake configurat ...

android程序的配置现在一直在改动,估计在Qt 5.2正式发布的时候会有一个比较好的解决方案。
回复 支持 反对

使用道具 举报

累计签到:5 天
连续签到:1 天
2014-2-19 19:39:12 显示全部楼层
希望QT得到推广,用的人越来越多,现在Android牛B的不行,qt用的人都不多,郁闷
回复 支持 反对

使用道具 举报

尚未签到

2014-3-13 09:52:51 显示全部楼层
yafei老师你好,我编写开发实战精解中的方块游戏出现如下问题,不知道怎么回事。
D:\Qtprojiect\qt34\myGame\mybox.cpp:12: error: reference to 'transform' is ambiguous     oldTransform = transform();
                    ^
D:\Qtprojiect\qt34\myGame\mybox.cpp:50: error: reference to 'setTransform' is ambiguous
     setTransform(oldTransform);
     ^
回复 支持 反对

使用道具 举报

累计签到:1568 天
连续签到:1 天
2014-3-18 09:40:52 显示全部楼层
wangxiangjun88 发表于 2014-3-13 09:52
yafei老师你好,我编写开发实战精解中的方块游戏出现如下问题,不知道怎么回事。
D:\Qtprojiect\qt34\myGam ...

你用的Qt什么版本,应该是Qt 版本问题,建议使用Qt 4
回复 支持 反对

使用道具 举报

尚未签到

2014-3-30 07:46:56 显示全部楼层
希望QT得到推广,用的人越来越多
回复 支持 反对

使用道具 举报

累计签到:595 天
连续签到:1 天
2014-4-4 10:21:55 显示全部楼层
挺喜欢Qt正在从0开始,刚买了本yafei老师的qtcreator教材,不知道会不会出5的?
回复 支持 反对

使用道具 举报

累计签到:1568 天
连续签到:1 天
2014-4-6 09:27:01 显示全部楼层
sywh 发表于 2014-4-4 10:21
挺喜欢Qt正在从0开始,刚买了本yafei老师的qtcreator教材,不知道会不会出5的? ...

快了,不过Qt 5的书没有QWidgets编程的内容的。
回复 支持 反对

使用道具 举报

累计签到:595 天
连续签到:1 天
2014-4-8 08:47:13 显示全部楼层
yafeilinux 发表于 2014-4-6 09:27
快了,不过Qt 5的书没有QWidgets编程的内容的。

先抱着4.8学基础吧,虽然也用Qt写了一些小程序,感觉好大的力不从心,以后肯定要经常论坛麻烦各位老师了,书在当当买的
回复 支持 反对

使用道具 举报

累计签到:1568 天
连续签到:1 天
2014-4-8 18:57:40 显示全部楼层
sywh 发表于 2014-4-8 08:47
先抱着4.8学基础吧,虽然也用Qt写了一些小程序,感觉好大的力不从心,以后肯定要经常论坛麻烦各位老师了: ...

嗯,QML编程很多是基于widget的,有了前面的基础,学习qml很快的。

慢慢来,欲速则不达。
回复 支持 反对

使用道具 举报

尚未签到

2014-7-30 09:25:58 显示全部楼层
我为什么看不到老师的讲义的图片
回复 支持 反对

使用道具 举报

尚未签到

2014-7-30 09:28:20 显示全部楼层
zhenggl 发表于 2014-7-30 09:25
我为什么看不到老师的讲义的图片

原来是权限的问题,已解决
回复 支持 反对

使用道具 举报

尚未签到

2014-10-19 14:25:36 显示全部楼层
本帖最后由 大灰狼 于 2014-10-19 14:26 编辑

期待讲解Qt5 的教程和书~~~
另外,帖子中的视频不能看了。。
回复 支持 反对

使用道具 举报

尚未签到

2015-5-28 21:07:09 显示全部楼层
yafei老师,你好!
     我在Qt5.3中使用QPrinter类时报错
《mainwindow.obj:-1: error: LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall QPrinter:Printer(enum QPrinter:rinterMode)" (__imp_??0QPrinter@@QAE@W4PrinterMode@0@@Z),该符号在函数 "private: void __thiscall MainWindow::doPrint(void)" (?doPrint@MainWindow@@AAEXXZ) 中被引用》

我在.pro中加有qtHaveModule(printsupport): QT += printsupport,在.cpp中加有头文件 <QtPrintSupport/QPrinter> ,可还是报这个错误。
请教yafei老师,这是怎么回事。
回复 支持 反对

使用道具 举报

累计签到:1568 天
连续签到:1 天
2015-6-2 22:10:40 显示全部楼层
zhangxiang 发表于 2015-5-28 21:07
yafei老师,你好!
     我在Qt5.3中使用QPrinter类时报错
《mainwindow.obj:-1: error: LNK2019: 无法解析 ...

可以先确定下原因,比如只定义一个该类的对象,不要进行任何操作,看是否报错,如何没有问题,再添加简单的操作,一步一步确定出错原因。
回复 支持 反对

使用道具 举报

累计签到:2 天
连续签到:1 天
2016-10-11 11:10:59 显示全部楼层
希望能好好用qt做出漂亮的东西
回复 支持 反对

使用道具 举报

累计签到:19 天
连续签到:1 天
2017-2-20 10:05:30 显示全部楼层
学习了。不过现在一般都习惯用VS2015附带的插件方式编写QT界面,主要是QT调试器确实不太好用。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了