Qt 学习之路 2(6):Qt 模块简介

计划于上个月发布的 Qt 5.14
经过短暂的推迟后,现在终于发布了稳定版。该版本以及明年的
Qt 5.15 LTS 开始为发布 Qt 6
做铺垫。开发团队表示,尽管他们正在努力通过标记不推荐使用的功能以使将来尽可能平稳地移植到
Qt 6,但现在还是引入了一些新功能。

两个月前,Qt 5.13 稳定版正式发布,按照官方提供的发布计划,Qt 5.14
将在今年年底发布,明年中旬推出 Qt 5.15(或许是 Qt 5
的最后一个版本),接着就是可能会在 2020 年底问世的 Qt 6。

Qt 5.14 Beta 2 发布,该版本主要内容有:

 Home

Qt 5.14 更新内容概述:

这就意味着从 Qt 5 到 Qt
6,期间经历了长达八年的时间,如此大的跨度,对于一个开源框架意味着什么?Qt
6 又会迎来怎样的变化?近日 Qt
团队在博客发表文章介绍了他们在技术方面对 Qt 6
寄予的愿景
Qt 学习之路 2(6):Qt 模块简介。。下面就来看看官方是如何看待 Qt 6 的。

  • 引入独立于图形 API 的视图渲染器,包括支持 Vulkan
  • 更好的 HiDPI 处理
  • Qt Multimedia 现在支持 GStreer OpenGL
  • 改进 Qt 3D 线程
  • 新的 Qt Quick Timeline 

 / 

  • 引入了一个独立于图形 API
    的场景图(scenegraph)渲染器,该渲染器将继续在 Qt 6.0 上使用,并且对于
    Qt on Vulkan 来说也很重要;
  • 正在进行的 HiDPI 改进(用于处理当今的高像素密度显示器);
  • 针对 Qt 3D 线程和其他 Qt Quick 3D 工作的改进;
  • 对带有 Qt Multimedia 的 GStreamer OpenGL 的支持;
  • 引入 Qt Quick Timeline;
  • 升级 Qt WebEngine 以及 Chromium 上的所有最新产品;
  • 升级 Qt for Automation

按照官方的说法,Qt 6 会保持对 Qt 5 的延续性 —— 继续他们在 Qt 5
系列中所做的工作,并尽可能不对 Qt 5 用户在使用方面造成破坏性影响。但 Qt
6
毕竟是作为一个新的主要版本面世,它也有自己的使命,它将为我们提供更高的自由度来实现新功能,以更好地支持当前和未来的要求,而这不是当前
Qt 5 系列能满足的。

Qt 5.14 之后,QT 5.15
更新预计将在春季进行,但可能只是一个相对较小的更新,侧重于 Qt6 的 bug
修复和更改,如果没什么意外,QT 6.0 将在 2020 年年底前亮相。 

Qt 学习之路 2

虽然 Qt 已将 OpenGL 用作基本图形 API,但现在它开始支持更广泛的图形
API。Qt 5.14 包括一个独立于图形 API 的场景图渲染器(通过称为 Qt
渲染硬件接口的抽象层)作为选择功能。通过它,我们可以在 Vulkan、Metal 和
Direct3D 11 之上运行 Qt Quick
应用程序。因此,我们可以选择直接在操作系统提供的原生图形 API 之上运行 Qt
应用程序。这也将使升级到 Qt 6 更容易,因为渲染硬件接口将是在 Qt 6
中渲染图形的标准方法。

Qt 6 还会对代码库进行清理并使其更易于维护。因此,重点将放在那些需要在 Qt
内进行架构变更的项目中,这带来的影响就是,如果不破坏与 Qt 5.x
某种程度的兼容性就无法完成这些变更。

详情见发布说明:

 / 

Qt Quick 新添加的 Qt Quick Timeline
模型提供了一种通过时间轴和关键帧为属性设置动画的简便方法。此外,Qt
Quick 引入的另一个功能是鼠标滚轮的事件处理程序(亦称为”WheelHandler“)和来自触控板的模拟鼠标滚轮事件。

结合对 Qt 5 的延续性,所以 Qt 6
的目标之一就是在满足新要求的前提下,尽最大程度保证与 Qt 5
系列的兼容性
。由于 Qt 5 的新版本仍在研发中,官方表示会将 Qt 6
的一些特性放到 Qt 5.14 和 Qt 5.15 LTS 中实现。随着 Qt 5.14
的特性冻结,研发工作的重心将转向 Qt 6,并希望在 2020 年底发布首个版本。

Qt 学习之路 2(6):Qt 模块简介

Qt Quick 3D 也是一个新模块,开发团队表示正在努力提供一个高级 API,用于从
Qt Quick 为用户界面创建 3D 内容。简而言之,现在我们可以使用 QML 来定义
3D 场景,从而允许对 UI 的 2D 和 3D 部分使用基于 QML
的方法。这种新方法将使我们可以使用一个runtime (Qt
Quick)、一个公共场景图和一个动画框架。我们将能够在一个设计工具 Qt Design
Studio 中以图形方式设计所有这些元素。

众所周知,Qt 最大的亮点之一就是其跨平台特性 ——
开发者通过使用一种技术和单一代码库即可将应用程序部署到所有桌面、移动和嵌入式平台。而桌面平台是
Qt 立足的根本,对 Qt 而言这是最核心和最重要的市场。因此保持 Qt
在桌面市场的健康和增长是在其他市场也能够增长的先决条件。

 

 豆子  2012年8月26日  Qt 学习之路
2  20条评论

Qt 5 与 Qt 4 最大的一个区别之一是底层架构有了修改。Qt 5
引入了模块化的概念,将众多功能细分到几个模块之中。Qt 4
也有模块的概念,但是是一种很粗的划分,而 Qt 5 则更加细化。本节主要对 Qt
5
的模块进行一个简单的介绍,以便以后大家需要哪些功能的时候知道到哪个模块去寻找。

Qt 5 模块分为 Essentials Modules 和 Add-on
Modules
两部分。前者是基础模块,在所有平台上都可用;后者是扩展模块,建立在基础模块的基础之上,在能够运行
Qt 的平台之上可以酌情引入。

 

Qt 基础模块分为以下几个:

  • Qt Core,提供核心的非 GUI
    功能,所有模块都需要这个模块。这个模块的类包括了动画框架、定时器、各个容器类、时间日期类、事件、IO、JSON、插件机制、智能指针、图形(矩形、路径等)、线程、XML
    等。所有这些类都可以通过 <QtCore> 头文件引入。
  • Qt Gui,提供 GUI
    程序的基本功能,包括与窗口系统的集成、事件处理、OpenGL 和 OpenGL ES
    集成、2D 图像、字体、拖放等。这些类一般由 Qt
    用户界面类内部使用,当然也可以用于访问底层的 OpenGL ES 图像 API。Qt
    Gui 模块提供的是所有图形用户界面程序都需要的通用功能。
  • Qt
    Multimedia
    ,提供视频、音频、收音机以及摄像头等功能。这些类可以通过
    <QtMultimedia> 引入,而且需要在 pro 文件中添加 QT
    += multimedia。
  • Qt Network,提供跨平台的网络功能。这些类可以通过
    <QtNetwork> 引入,而且需要在 pro 文件中添加 QT += network。
  • Qt Qml,提供供 QML(一种脚本语言,也提供 JavaScript 的交互机制)
    使用的 C++ API。这些类可以通过 <QtQml> 引入,而且需要在 pro
    文件中添加 QT += qml。
  • Qt Quick,允许在 Qt/C++ 程序中嵌入 Qt Quick(一种基于 Qt
    的高度动画的用户界面,适合于移动平台开发)。这些类可以通过
    <QtQuick> 引入,而且需要在 pro 文件中添加 QT += quick。
  • Qt SQL,允许使用 SQL 访问数据库。这些类可以通过 <QtSql>
    引入,而且需要在 pro 文件中添加 QT += sql。
  • Qt Test,提供 Qt 程序的单元测试功能。这些类可以通过
    <QtTest> 引入,而且需要在 pro 文件中添加 QT += testlib。
  • Qt Webkit,基于 WebKit2 的实现以及一套全新的 QML
    API(顺便说一下,Qt 4.8 附带的是 QtWebkit 2.2)。

Qt 扩展模块则有更多的选择:

  • Qt 3D,提供声明式语法,在 Qt 程序中可以简单地嵌入 3D 图像。Qt 3D
    为 Qt Quick 添加了 3D 内容渲染。Qt 3D 提供了 QML 和 C++ 两套
    API,用于开发 3D 程序。
  • Qt Bluetooth,提供用于访问蓝牙无线设备的 C++ 和 QML API。
  • Qt Contacts,用于访问地址簿或者联系人数据库的 C++ 和 QML API。
  • Qt Concurrent,封装了底层线程技术的类库,方便开发多线程程序。
  • Qt D-Bus,这是一个仅供 Unix 平台使用的类库,用于利用 D-Bus
    协议进行进程间交互。
  • Qt Graphical
    Effects
    ,提供一系列用于实现图像特效的类,比如模糊、锐化等。
  • Qt Image Formats,支持图片格式的一系列插件,包括 TIFF、MNG、TGA
    和 WBMP。
  • Qt JS Backend,该模块没有公开的 API,是 V8 JavaScript
    引擎的一个移植。这个模块仅供 QtQml 模块内部使用。
  • Qt Location,提供定位机制、地图和导航技术、位置搜索等功能的 QML
    和 C++ API。
  • Qt OpenGL,方便在 Qt 应用程序中使用 OpenGL。该模块仅仅为了程序从
    Qt 4 移植到 Qt 5 的方便才保留下来,如果你需要在新的 Qt 5 程序中使用
    OpenGL 相关技术,需要使用的是 QtGui 模块中的 QOpenGL。
  • Qt Organizer,使用 QML 和 C++ API 访问组织事件(organizer
    event)。organizer API 是 Personal Information Management API
    的一部分,用于访问 Calendar 信息。通过 Organizer API
    可以实现:从日历数据库访问日历时间、导入 iCalendar
    事件或者将自己的事件导出到 iCalendar。
  • Qt Print Support,提供对打印功能的支持。
  • Qt Publish and
    Subscribe
    ,为应用程序提供对项目值的读取、导航、订阅等的功能。
  • Qt Quick 1,从 Qt 4 移植过来的 QtDeclarative 模块,用于提供与 Qt
    4 的兼容。如果你需要开发新的程序,需要使用 QtQuick 模块。
  • Qt Script,提供脚本化机制。这也是为提供与 Qt 4
    的兼容性,如果要使用脚本化支持,请使用 QtQml 模块的 QJS* 类。
  • Qt Script Tools,为使用了 Qt Script
    模块的应用程序提供的额外的组件。
  • Qt Sensors,提供访问各类传感器的 QML 和 C++ 接口。
  • Qt Service Framework,提供客户端发现其他设备的服务。Qt Service
    Framework 为在不同平台上发现、实现和访问服务定义了一套统一的机制。
  • Qt SVG,提供渲染和创建 SVG 文件的功能。
  • Qt System Info,提供一套
    API,用于发现系统相关的信息,比如电池使用量、锁屏、硬件特性等。
  • Qt Tools,提供了 Qt 开发的方便工具,包括 Qt CLucene、Qt
    Designer、Qt Help 以及 Qt UI Tools 。
  • Qt Versit,提供了对 Versit API 的支持。Versit API 是 Personal
    Information Management API 的一部分,用于 QContacts 和 vCard 以及
    QOrganizerItems 和 iCalendar 之间的相互转换。
  • Qt Wayland,仅用于 Linux 平台,用于替代 QWS,包括 Qt Compositor
    API(server)和 Wayland 平台插件(clients)。
  • Qt WebKit,从 Qt 4 移植来的基于 WebKit1 和 QWidget 的 API。
  • Qt Widgets,使用 C++ 扩展的 Qt Gui
    模块,提供了一些界面组件,比如按钮、单选框等。
  • Qt XML,SAX 和 DOM 的 C++ 实现。该模块已经废除,请使用
    QXmlStreamReader/Writer。
  • Qt XML Patterns,提供对 XPath、XQuery、XSLT 和 XML Schema
    验证的支持。

这里需要强调一点,由于 Qt 的扩展模块并不是 Qt 必须安装的部分,因此 Qt
在未来版本中可能会提供更多的扩展模块,这里给出的也仅仅是一些现在确定会包含在
Qt 5 中的一部分,另外还有一些,比如 Qt Active、Qt QA 等,则可能会在 beta
及以后版本中出现。

Qt 4 也分成若干模块,但是这些模块与 Qt 5 有些许多不同。下面是 Qt 4
的模块:

  • QtCore,Qt 提供的非 GUI 核心类库,这一部分与 Qt 5
    大致相同,只不过 Qt 4 的 core 类库中并不包含 JSON、XML 处理等。
  • QtGui,图形用户界面组件,这个模块相当于 Qt 5 的 QtGui 与
    QtWidgets 两个模块的总和。
  • QtMultimedia,多媒体支持,类似 Qt 5 的相关部分。
  • QtNetwork,网络支持,类似 Qt 5。
  • QtOpenGL,提供对 OpenGL 的支持。在 Qt 5 中,这部分被移植到 QtGui
    模块。
  • QtOpenVG,提供对 OpenVG 的支持。
  • QtScript,提供对 Qt Scripts 的支持。Qt Script 是一种类似于
    JavaScript 的脚本语言。在 Qt 5 中,推荐使用 QtQml 的 JavaScript
    部分。
  • QtScriptTools,为 Qt Script 提供的额外组件。
  • QtSql,提供对 SQL 数据库的支持。
  • QtSvg,提供对 SVG 文件的支持。
  • QtWebKit,提供显示和编辑 Web 内容。
  • QtXml,XML 处理,这部分在 Qt 5 中被添加到了 QtCore。
  • QtXmlPatterns,提供对 XQuery、XPath 等的支持。
  • QtDeclarative,用于编写动画形式的图形用户界面的引擎。
  • Phonon,多媒体框架。
  • Qt3Support,Qt 3 兼容类库。

下面是 Qt 4 的一些工具模块:

  • QtDesigner,用于扩展 Qt Designer。
  • QtUiTools,用于在自己的引用程序中处理 Qt Designer 生成的 form
    文件。
  • QtHelp,联机帮助。
  • QtTest,单元测试。

下面是专门供 Windows 平台的模块:

  • QAxContainer,用于访问 ActiveX 控件。
  • QAxServer,用于编写 ActiveX 服务器。

下面是专门供 Unix 平台的模块:

  • QtDBus,使用 D-Bus 提供进程间交互。

详细内容请查看 https://www.qt.io/blog/

下面将介绍在 Qt
中进行的一些关键技术变更,以使其能适应未来几年的技术发展。

(文/开源中国)    

下一代 QML

QML 和 Qt Quick 是过去几年推动 Qt
框架持续增长的主要技术。通过使用这些技术以直观的方式创建用户界面也是其产品的独特卖点。

不过 QML 毕竟是为 Qt 5
而创建的,存在一些怪异的操作及其局限性。因此开发团队计划借 Qt 6 以实现对
QML 的重大改进。目前计划的主要变化是:

  • 引入强大的类型系统
  • 使 JavaScript 成为 QML 的可选功能
  • 移除 QML 的版本控制功能
  • 移除 QObject 和 QML 之间的重复数据结构
  • 避免在 runtime 阶段生成数据结构
  • 支持将 QML 编译为高效的 C++ 和原生代码
  • 支持隐藏实现细节
  • 更好的工具集成

下一代图形堆栈

自 Qt 5 发布以来,图形领域已经发生了许多变化,所以 Qt
框架不得不对图形堆栈进行重大改进以保持竞争力。

Qt 5 使用 OpenGL 作为 3D 图形的统一
API。不过也是从那时起,业界诞生了许多新的 API。Vulkan 是 Linux 平台上
OpenGL 的指定继承者,Apple 正在推动 Metal 的发展,而微软则推出了 Direct
3D。这就意味着 Qt 将来必须与所有这些 API 无缝协作。为了实现这一点,Qt
必须定义一个新的层对图形 API 进行抽象(如用于平台集成的
QPA),官方将这个层称为渲染硬件接口(Rendering Hardware
Interface,RHI),他们需要将所有渲染基础设施(QPainter,Qt Quick
Scenegraph 以及对 3D 的支持)建立在该层之上。

此外,团队还打算为 Qt 6
带来统一的主题/样式引擎,这将使我们能够在桌面和移动平台上获得 Qt Widgets
和 Qt Quick 的原生外观。

对 C++ API 的增强

C++ 在过去几年里发生了巨大的变化。Qt 5 使用的还是 C++98 标准,到现在 Qt
6 已经开始使用 C++ 17。C++ 17 提供了更多的开箱即用功能,而这在 Qt 5
中是无法使用的,所以 Qt 6 的目标是更好地集成 C++ 17 的新功能,并保持对
Qt 5 的兼容性。

除此之外,团队还计划通过 C++ 为 QML 和 Qt Quick 引入一些新功能,致力于为
QObject 和相关类引入一个新的属性系统,将 QML 中的绑定引擎集成到 Qt
的内核,并可通过 C++ 进行使用。

新的属性系统和绑定引擎将大大减少绑定的 runtime 开销和内存消耗,并使 Qt
的所有其他部分都可以访问它们,而不仅仅是 Qt Quick。

对新语言的支持

Qt 5.12 引入了对 Python 的支持,此外团队还尝试通过引入 Qt for
WebAssembly 技术将浏览器添加为新平台。在 6.0
发布之后,保持并进一步扩展其跨平台特性将是 Qt 6 系列的重要组成部分。

与 Qt 5 的兼容性和增量改进

保持与旧版本的兼容性非常重要,官方表示这也是他们开发 Qt 6
的主要要求之一。团队在博客中说到,他们确实会删除 Qt
的某些弃用功能,但也会确保用户所需的功能不受影响。这意味着关键功能,例如
Qt Widgets 和大部分用户使用的其他功能都将保持其可用性。

团队还计划对 Qt 5
系列中无法完成的核心类和功能进行渐进式改进,目的是保持完全的源代码兼容性,但由于对二进制兼容性没有要求,因此团队会继续实现在
Qt 5 中无法完成的代码清理和改进。

最终的目标应该是 Qt 6 与 Qt 5.15
LTS 
有足够的兼容性,如此一来开发者就可以轻松维护一个同时针对这两个版本编译的大型代码库。

(文/开源中国)