Qt模块框架

一、Qt基本模块

QT5引入了模块化的概念,将实现众多功能的QT库细分为各个模块,也就是说一个模块中包含了实现某种功能的众多C++类库。QT4也有模块的概念,但没有QT5划分的细。

Qt 5 模块分为 3个大的部分:Qt Essenrtials(Qt基本模块)、Qt Add-Ons(扩展模块)、Qt Tools(开发工具)。前者是基础模块,在所有平台上都可用;后者是扩展模块,建立在基础模块的基础之上,在能够运行 Qt 的平台之上可以酌情引入。

    QtEssentials包含了所有基本的Qt模块,这些模块可以在全部支持的开发平台与特定的测试目标平台上良好的运行,并且保持了不错的兼容性。这些必需的模块广泛使用在大部分的Qt应用程序中。即使一个模块可以在所有支持的开发平台上使用,只要其被使用于实现特定的问题,它就被归为add-on模块组中。
Qt5 基础模块分为以下几个:

 

 

Qt 5 中 由于QML和Qt Quick 的出现,使得在Qt 5 中 c++与QML +javaScript的地位几乎平等,Qt 5 中的几乎所有上层API 都同时支持面向C++和面向QML的两套接口

部分扩展模块:

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 GUI主要为各种图形界面控件提供一般的处理
  • Qt GUI的图形部件类移动到Qt Widgets中
  • Qt 5移除Qt OpenGL 把QOpenGL添加到Qt GUI中

了解了图形库的大体更改,下面我们来看一下 Qt 图形界面库的整体框架。如下图所示。

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

图形界面库架构的主要特点:
把全部的Qt 接口迁移到Qt 平台抽象层(QPA)上,使得能更好的移植到另外的系统和设备上
重新设计了图形堆栈,使得性能提高,Qt 5为Qt Quick引入全新的图形架构,基于OpenGL的场景图更加灵活的模块结构,满足桌面和移动的融合,按需添加或删除特定的模块

三、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 版本中,V8 已经完全被一个新的 Qt 专有引擎代替了,原因是 V8 适用于浏览器却不太适用于 qml。我们也可以看到 QtQml 本身并没有涉及图形显示的内容;

QtQuick 以 QPA 为基础,而后经过了 QtGui、OpenGL 和 Scene graph 三层封装,这里可以看到,新的 QtQuick 是建立在 OpenGL 之上的,并且使用了新的 Scene graph 进行图形渲染。很明显,QtQuick 就是用于图形显示的。

四、Qt 5的部分特点

  • 现在的Qt涵盖多个平台,使用Qt开发框架可以开发出含桌面。嵌入式。移动等多个平台的应用程序。
  • Qt 5 使用基于OPenGL的场景图来加速Qt Quick的图形显示,可以设计出更好的设计,即使在移动或嵌入式设备上亦可以流畅运行
  • Qt 5的 Qt Quick   为QML饮用提供了基础的框架
  • Canvas 提供绘画
  • Shader Effects 将GLSL着色器程序集成到QML中
  • Particle Effects 粒子效果可以创建各种2D粒子子系统
  • Sprites 用于2D图像对象的动画效果中,也可用于粒子系统的源
  • Offline storage JavaScriptAPI
  • Window 提供一个顶级窗口
  • OpenGL Qt Quick基于OpenGL渲染架构来获得最佳性能
  • Qt Quick 降低了开发的复杂度,Qt Quick  Control和Qt Quick Layouts使得设计用户界面变得更加简单
  • Qt 5中可以使用传感器和地图定位
  • Qt 5带来最新的HTML5的支持,QtWebEngine 是Web内容的渲染引擎
  • Qt MuLtimedia 提供多媒体方面的功能
  • Qt Location 模块提供了地图位置的数据
  • Qt平台抽象层(QPA)Qt 窗口系统相关的部分在Qt5中全部基于Qt 平台抽象层进行重写
  • 简化移植Qt到新平台所需要的工作
  • 集中窗口系统集成代码库到一些类中,使得类多平台共享
  • 在Qt 中删除窗口依赖,使得在多个窗口系统中可以运行同一个Qt二进制文件成为可能Qt 5更新了信号与槽机制
  • Qt 5对IVP6和双模式提供了更好的支持‘
  • Qt 5 涵盖了多种触控输入


五、c++和QML 


在Qt 5 中添加了QML,这样在设计时需要使用哪个进行开发,现在的大型项目一般使用QWidget为主QML和Qt Quick 为辅的开发模式

  • QWidget现在依然是开发桌面应用的核心,拥有丰富的组件
  • QML和Qt Quick 现在刚推出不久,开发组件比较缺乏企业级应用程序的控件
  • C++现在依然是Qt开发的主体,但在富含动画的效过上QML明显占优


六、Qt 5 新的信号与槽和旧的信号与槽的区别


 旧的信号与槽:

connect(sender,SIGNAL(valueChanged(参数)),recriver,SLOT(showValue(参数)))

新的信号与槽:

connect(sender,&Sender::valueChanged,receiver,&Receiver::showValue)


新的信号与槽的特点:

  • 支持编译期检查,会在编译时检查信号与槽的拼写错误等
  • 支持相容参数类型的自动转换,新的语法不仅可以支持使用typedef或者命名空间,还支持使用隐式的自动类型钻换
  • 允许连接到任意函数,旧的信号与槽只能使用slots关键词修饰的成员函数,新语法中可以通过函数指针直接调用函数
  • 在槽函数中可以使用c++11中的lambda表达式替代
  • 槽函数可以被声明为private 但SLOT会无视private的修饰
  • 当有重载信号时,使用新的信号与槽需要转化为函数指针

signals:
void show(QString);
void show(int);
 
 
//函数指针
//返回类型(类名:: *名称)(参数类型)=&类名::函数名
 
//转化为函数指针,假设类名为 widget
void(widget:: * p1)(QString)=&widget::show;
void(widget::*p2)(int)=&widget::show;


 七、在Qt5中的c++11的宏:


到Qt 5中可能有些编译器不支持c++11,Qt 5 通过一系列宏来兼容c++11

  • constexpr:用于向编译器起指出那些内联函数可以在编译器运算,使用Q_DECL_CONSTEXPR宏
  • static_assert :c++11添加了静态断言,允许在编译器检测一些条件是否成立,使用Q_STATIC_ASSERT和Q_STATIC_ASSERT_X两个宏
  • override :当一个函数被override修饰时,这个函数必须覆盖父类的函数 使用,Q_DECL_OVERRIDE(用于函数末尾)
  • final :用于打断 父类声明为virtual,所有子类的相同函数都为virtual的机制,如果一个虚函数被final修饰,这个函数在这个类中的所有子类都不允许被覆盖。使用Q_DECL_FINAL(用于函数末尾)
  • deleted 用于显示禁止C++编译器生成代码,使用Q_DECL_DELETE(作用于函数末尾)
     

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高亚奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值