Qt 6 正式发布
Qt 6.0 正式发布了。该版本是 Qt 6 系列的第一个版本,旨在满足一些新的市场需求。
官方表示,自 2012 年发布 Qt 5.0 以来,Qt 的用户群体和使用量都有巨大的增长。但是八年来,世界发生了重大变化,比如嵌入式系统中 Qt 的使用量猛增,C++不断发展,出现了新的 3D 图形 API 等。这些都是直接影响 Qt 发展迭代的因素。
因此,官方称 Qt 6 的任务是使 Qt 成为未来的生产力平台。作为 Qt 的主要版本,Qt 6.0 是 Qt 5 系列的延续,提供了更高的自由度,以实现新功能。Qt 6 的主要变化包括这些领域:
- 适配 C++ 17
- 采用下一代 QML
- 采用新的图形架构
- Qt Quick 统一 2D 和 3D
- 改用 CMake 构建系统(老项目仍支持 qmake)
C ++ 17
在 Qt 6 中加入了一个与 C++ 17 兼容的编译器,以便在开发 Qt 时使用更现代的 C++ 语言构造,并允许在 API方面进行集成。
核心库和 API
作为 Qt 最核心部分的模块,Qt Core 本次更新遍历了许多领域并进行了改进,以下是一些最重要的变化:
- 新的属性和绑定系统:该系统现在带来了绑定的概念,这使得 QML 在 C++ 的 Qt 5 中取得了巨大的成功。
- 字符串和 Unicode:官方从 Qt 5 开始将 Qt 与 Unicode 完全对齐,但是 Qt 6 中还有一些问题需要整理解决。更多详细信息将在稍后的单独博客中发布。
- QList 是一个在 Qt 5 中经常被批评的类,因为它是堆分配存储在其中的对象的对象,该对象大于指针,从而给堆分配方法带来压力。在 Qt 6 中对此进行了更改,并将 QList 和 QVector 统一为一个类。有关详细信息,请参见 Qt 6 中有关 QList 的博客文章。
- QMetaType 和 QVariant 是 Qt 的元对象系统如何工作的基础。没有 QMetaType,就不可能有信号和插槽,并且动态调用需要 QVariant。这两个类在 Qt 6 中被几乎完全的重写,可以在此处阅读有关详细信息。
Qt 的其他与图形无关的部分也发生了很大的变化。例如,Qt Concurrent 也经历了几乎完全的重写,并且现在比以往更加轻松地进行多线程应用程序的开发。Qt Network 也有许多清理和改进。有关详细信息,请参见此博客文章。
新的图形架构
Qt 5 的图形体系结构非常依赖 OpenGL 作为底层 3D 图形 API。但过去 8 年来随着 Metal 和 Vulkan 的推出,市场发生了巨大变化。现在,Qt 6 加入了大量不同平台的图形 API,以确保用户可以在所有平台上以最高性能运行 Qt。
在 Qt Quick 中的所有 3D 图形现在都基于称为 RHI(渲染硬件接口)的 3D 图形新抽象层之上。RHI 使 Qt 可以使用基础 OS /平台的本机 3D 图形 API。因此,默认情况下,Qt Quick 现在将在 Windows 上使用Direct3D,在 macOS 上使用 Metal。有关详细信息,请参阅有关 RHI 的博客文章系列。
Qt 中的 OpenGL 特定类仍然存在,但现在已从 QtOpenGL 模块中的 QtGui 中移出。此外,Qt 6 还添加了一个名为 QtShaderTools 的新模块,以跨平台的方式处理这些 API 的不同着色语言。
Qt Quick 3D 和 Qt 3D
Qt Quick 3D 是一个相对较新的模块。它通过 3D 功能无缝扩展了 Qt Quick。
这个模块在 Qt 6 上有了重大的改进,它现在始终使用 RHI 抽象层来充分利用基础图形 API 和硬件。此外,它现在在 2D 和 3D 内容之间具有更深、更高性能的集成,使用户可以将 2D 项放置到 3D 场景中。它还大大改进了对 glTF2 和基于物理引擎的渲染支持。该模块还有许多其他重大改进,有关详细说明,请参见单独的博客文章。
Qt 3D 现在也基于 RHI 抽象层之上,进行了一些性能改进和清理。
构建系统和软件包
Qt 6 还对构建和分发 Qt 的方式进行了一些重大更改。值得一提的是,Qt 6 本身现在是使用 CMake 构建的。这也为使用 CMake 构建项目的所有用户带来了体验优化。官方将在 Qt 6 的生命周期内继续支持 qmake,因此老用户暂时无需对构建系统进行任何更改,但是官方建议所有新项目都使用 CMake。
Qt 6 还带有一个更小的默认软件包,许多附加组件现在通过软件包管理器作为单独的软件包分发。它为用户提供了更大的灵活性,开发者可以选择仅下载他们真正需要的内容。
目前,官方已经将现有的 Qt 安装程序用作软件包管理器的后端,但正在研究将来版本的替代方法。有关更多详细信息,请参见此处的博客文章。
支持平台
Qt 6 同样支持跨平台:
- Windows 10
- macOS 10.14 及更高版本
- Linux (Ubuntu 20.04, CentOS 8.1, OpenSuSE 15.1)
- iOS 13 或更高版本
- Android (API level 23 及更高版本)
在嵌入式方面,Qt 6 支持各种运行 Linux 的嵌入式设备。不过对于 Qt 5 支持的嵌入式实时操作系统,Qt 6 尚未提供支持。QNX 和 INTEGRITY 近期已增加对 C++17 的支持,Qt 团队计划在发布 Qt 6.2 时增加对它们的支持。
兼容性
Qt 开发团队表示,在对 Qt 6 进行修改时,他们也基于未来使用场景的考虑对 API 进行了调整,同时在兼容性方面尽量减少对现有用户的破坏。
因此,如果开发者希望使用 Qt 6,需要对代码进行调整。Qt 团队也表示已尽可能简化开发者移植到新版本的工作。
在 Qt 6 中,开发团队为代码库进行了全面清理,以删除在 Qt 5 生命周期中被弃用的 API 及模块。Qt 5 中部分被删除的最常用 API 已被迁移到 Qt5CoreCompat 模块。它包含从 Qt 6 中删除的几个广泛使用的类,例如 QRegExp, QTextCodec 和用于 XML 的旧 SAX 解析器以及其他部分项目。此模块旨在帮助开发者进行迁移,除了针对 Qt 5 的回归测试和安全相关问题外,该模块不会收到 bug 修复。开发团队建议使用它进行移植,然后逐步删除对模块的依赖。
对于下一个版本的发布安排,官方计划明年4月发布 Qt 6.1,然后在9月底发布 Qt 6 系列的首个长期支持版本 Qt 6.2 LTS。
当然,官方也花了一些时间修复了很多被开发者诟病的 BUG。更新详情请查看 Qt 6 的 Wiki 页面。
延伸阅读: