• 2846阅读
  • 3回复

Qt 6.2发布(含项目代码升级到Qt6吐血经验总结) [复制链接]

上一主题 下一主题
离线liudianwu
 

只看楼主 倒序阅读 楼主  发表于: 2021-10-09
### 一、前言
升级到Qt6吐血经验总结 [https://gitee.com/feiyangqingyun/qtkaifajingyan#二升级到qt6](https://gitee.com/feiyangqingyun/qtkaifajingyan#二升级到qt6)

我很高兴地宣布 Qt 6.2 的发布。Qt 6.2 是我们一直在努力的版本,因为我们开始迈向 Qt 的新主要版本。它受益于我们为 Qt 6 所做的所有架构升级,并且基本上包括您在 Qt 5.15 中喜欢的所有附加模块。

Qt 6.2 也是 Qt 6 的第一个版本,Qt 公司将为 Qt 商业客户提供长期支持。

我们在迁移到 Qt 6 时的计划是首先关注 Qt 的核心,然后进行我们认为在未来几年保持 Qt 竞争力所需的架构更改。但这种关注也意味着我们不得不在发布 Qt 6.0时对我们支持的附加组件做出妥协 。因此,尽管 Qt 6.0 比 Qt 5.15 更好、更先进,但它确实缺少 Qt 5.15 提供的一些功能。在 Qt 6.2 中,我们缩小了这一差距,并包含了 Qt 5.15 中的所有常用功能以及为 Qt 6 添加的新功能。

随着 Qt 6.2 的发布,几乎我们所有的用户都应该能够将他们的代码从 Qt 5 迁移到 Qt 6。我们已经使用自己的工具实现了这一点。也就是说,Qt Design Studio 2.2 和即将发布的 Qt Creator 6 beta 都是基于 Qt 6.2 LTS。

除了添加缺失的功能外,Qt 6.2 还专注于提高稳定性、性能和开发人员的生活质量。

在详细了解 6.2 中的新功能之前,让我们回顾一下 Qt 6 中的一些主要变化。

### 二、Qt 6 的架构变化
我们在 Qt 6 中进行了一些更广泛的架构更改,我们现在正在构建 Qt 6.2 和任何未来版本。
- 利用 C++17 在处理 Qt 6 时,我们希望建立在现代 C++ 标准之上。C++17 是最新发布的版本,而 Qt 6 现在依赖于 C++17 兼容编译器。这使得我们可以清理和改进我们的代码库,并为我们的用户提供更现代的 API。
- 在处理大型数据集和性能方面改进了我们的低级容器类。
- 下一代 QML 我们已经开始更加努力地更新 QML 语言,使其在未来更安全、更易于使用。Qt 6.0 – 6.2 在这里奠定了基础,但这种持续的努力将在整个 Qt 6 系列中继续进行。
- 将属性绑定引入 C++ 属性绑定是使 QML 如此成功的概念之一。在 Qt 6 中,我们一直在 C++ 中提供该概念 。
- 新的图形架构 Qt 6 在如何处理与底层操作系统 API 的集成方面采用了 全新的架构。得益于新的渲染硬件接口 (RHI),Qt 6 现在默认使用每个系统上可用的最佳图形 API,显着提高了兼容性——尤其是在桌面和移动操作系统(如 Windows 和 macOS 以及 iOS)上。
- Qt Quick 的统一 2D 和 3D Qt Quick 一直是构建动画和流畅的 2D 用户界面的框架。使用 Qt 6,我们也简化了将 3D 内容集成到基于 QML 的应用程序的过程。深度集成使得在任何级别混合 2D 和 3D 内容变得微不足道,同时从系统中获得最大性能。
- CMake 构建系统 在 Qt 6 中,我们将构建系统从 qmake切换到 cmake,这是当今基于 C++ 的应用程序的标准构建系统。虽然在 Qt 6 的整个生命周期内仍支持 qmake,但初步用户报告表明切换到 cmake 后有显着改进。

### 三、添加模块
开发 Qt 6.2 的主要工作之一是重新添加我们在 Qt 6.0 中遗漏的所有模块和功能。除了极少数例外,Qt 5.15 支持的所有模块现在也支持 Qt 6.2。

在 Qt 6.2 中,我们添加了对以下附加模块的支持(在 Qt 6.1 中已有的模块之上):

- Qt Bluetooth
- Qt Multimedia
- Qt NFC
- Qt Positioning
- Qt Quick Dialogs
- Qt RemoteObjects
- Qt Sensors
- Qt SerialBus
- Qt SerialPort
- Qt WebChannel
- Qt WebEngine
- Qt WebSockets
- Qt WebView

这些模块的 API 主要向后兼容 Qt 5,并且在移植到 Qt 6 时只需要对用户代码进行少量调整。

Qt 6.2 支持的 [完整模块列表](https://doc.qt.io/qt-6/qtmodules.html) 可以在我们的文档中找到 。

### 三、Qt 6.2 中的新功能
除了我们从 Qt 5 带来的许多模块之外,我们 在 6.2 中还有大量的 [新特性](https://wiki.qt.io/New_Features_in_Qt_6.2)和功能。我们来看一下。

#### (一)、Qt 快速 3D
Qt Quick 3D 获得了一些很酷的新功能,现在支持 实例化渲染,允许您使用不同的变换渲染大量相同的对象。我们还添加了一个新的 API,用于向 场景添加 3D 粒子效果。

输入处理已得到改进,我们现在可以为嵌入在 3D 场景中的 2D 项目正确创建 Qt Quick 输入事件。我们还添加了一个新的 API,用于从场景中的任意点进行基于光线的拾取。

#### (二)、QML工具
Qt 6.2 对 QML 工具进行了较大改进。我们现在有一个公共的 CMake API  ,它极大地简化了创建您自己的 QML 模块的过程。

QML linter (qmlint) 是一种工具,用于检查 QML 源代码的最佳实践、潜在的编码和性能问题,并帮助编写更易于维护的 QML。该工具经历了很大的变化,现在可以完全配置,无论是在命令行级别,还是通过配置文件,甚至是 QML 文件本身中的各个块。此外,它现在可以生成 JSON 输出以简化与其他工具或自动化系统的集成。

QML 格式化程序 (qmlformat) 现在使用 QML dom 库,大大改进了生成的输出。

#### (三)、Qt多媒体
Qt 多媒体在 Qt 6 中发生了一些相当大的变化。它是我们在 Qt 5 的生命周期中不满意的 API 之一。因此,我们退后一步,对 Qt 6 进行了一些更广泛的 API 和架构更改。没有过多考虑向后兼容性的模块。

尽管如此,从 Qt 5 中的 Qt 多媒体移植到 Qt 6 应该相对简单。

Qt 6 中的 Qt 多媒体确实支持一些我们在 Qt 5 中从未设法正确支持的高度要求的功能。示例包括播放的字幕和语言选择支持以及媒体捕获的可配置设置。

内部架构已经过清理,不再像 Qt 5 那样通过公共 API 公开。这将使我们能够更快地修复错误,并使将来添加新功能变得更加容易。您可以在有关 Qt 6 中的 Qt 多媒体的单独博客文章中找到更多详细信息。

然而,由于这些巨大的变化,该模块仍然存在粗糙的边缘,并且可能在实现中存在相当多的错误。但是,我们相信多媒体是一项必不可少的功能,我们将在 Qt 6.2 中完全支持该模块。

因此,我们将在补丁级别版本的常规提交策略上有所偏离,如果需要修复较大的问题,可能会添加一些较小的 API。

此外,我们将努力在即将发布的补丁级别版本中尽快修复任何报告的错误。

#### (四)、整个过程中的小改进
几乎所有其他模块都看到了许多较小的 API 添加和改进。

我们已经移植了许多 API 以利用新的属性系统,以便您可以使用 C++ 中的属性绑定。这项工作尚未完成,我们将在未来的版本中继续。

我们还在各个地方修复了许多 API 缺点和缺失的功能。仅举几个例子:

- Qt Charts 获得了一些新的 API,以提高便利性并使事情更加可定制。
- 我们为 QImage 添加了浮点图像格式。
- QByteArray::number() 现在可以正确处理 10 以外的基数的负值。
- QLockFile 现在具有采用 std::chrono 的重载
- Qt Network 支持多个可以在运行时共存的 SSL 后端。

#### (五)、Qt Creator 和 Qt Design Studio
Qt Creator 和 Qt Design Studio 也做了大量工作,以确保它们为 Qt 6.2 提供一流的支持。Qt Creator 5 包含您为 Qt 6.2 开发所需的一切。

我们今天还发布了全新版本的 Qt Design Studio。Qt Design Studio 2.2 基于 Qt 6.2,极大地支持在一个图形工具中创建基于 Qt Quick 和 Qt Quick 的 3D 用户界面。您可以轻松地在目标硬件上测试这些,无论是台式机、移动设备还是嵌入式设备。有关 更多详细信息,请查看有关Qt Design Studio 2.2的单独博客文章。

#### 四、新平台



对于 Qt 6.2,我们做了很多工作来改进我们对当前支持平台的支持,包括桌面和移动端,例如,通过改进我们对 HighDPI 渲染的支持和在 iOS 上添加 NFC 后端。

最重要的是,Qt 6.2 大大扩展了支持平台的范围:

Qt 6.2 完全支持 Apple Silicon 上的 macOS。Qt 现在可以轻松创建通用二进制文件并在 Intel 和 Apple Silicon 上为 macOS 进行开发。当然,该版本也在我们的 CI 系统中进行了全面测试。一直可以通过 Rosetta 层在 Apple 芯片上运行 Qt 应用程序,但 Qt 6.2 现在提供了在 Apple 芯片上本地运行的完整支持。

Qt 6.2 还恢复了对 INTEGRITY 和 QNX 实时操作系统的支持。支持需要 C++17 工具链和最新版本的操作系统。QNX 的最低要求是 7.1 版,在 INTEGRITY 上,我们支持 19.0.13 版。

针对 Qt 6.2 的 webOS 验证也已完成,以进一步加强 Qt 对 webOS 的承诺。

有很多工作正在进行以支持 Windows 11,我们希望能够在 6.2 补丁级别版本中为其提供全面支持。Windows on ARM HW 也可作为 Qt 6.2 的技术预览版提供。

最后,我们做了进一步的工作来改进我们对 WebAssembly 的支持,它在 Qt 6.2 中作为技术预览提供支持。

Qt for Python 今天也发布了,大家可以试一试。未来几天将发布一篇单独的博客文章,重点介绍最新 Qt 6.2 更改中采用的所有功能。敬请关注!

### 五、从 Qt 5 移植
在开发 Qt 6 时,与 Qt 5 的源代码兼容性一直是我们工作的关键部分。有一些地方我们不得不在某种程度上打破这种兼容性,以进行一些必需的架构更改或为我们带来一些巨大的性能优势。

在大多数情况下,从 Qt 5 移植到 Qt 6 应该很简单。在Qt的6移植指南 列出了所需要的步骤,并具有更多的信息。您还可以从我们的合作伙伴之一或我们的顾问那里获得移植帮助。

移植到 Qt 6 的典型步骤是:

- 检查您是否使用了受支持的编译器和平台版本
- 首先在 Qt 6 模式下使用 Qt 5.15 编译(使用 QT_DISABLE_DEPRECATED_BEFORE 宏)
- 然后用 Qt 6.x 编译 - 如果需要,在移植阶段利用兼容性模块

有了这些,您就可以在 Qt 6 上运行应用程序,并可以开始使用它提供的所有新特性和功能。例如,如果您的应用程序使用 QML,请运行 qmlint 工具并修复它给出的警告。

### 六、现在试试
在为您提供下载 Qt 6.2 的链接之前,我想向您指出 Qt 6.2的发行说明。发行说明还包含有关自 Qt 6.1 以来我们所做更改的许多详细信息,包括已修复错误的完整列表。

它们还包含为 Qt 6.2 贡献补丁的所有人的完整列表。列表太长,无法在此处重现,但我要感谢大家帮助和实现 Qt 6.2。

如果您已经安装了 Qt,那么获得 Qt 6.2 的最简单方法是通过在线安装程序。如果没有,您可以从您的Qt 帐户 或通过我们的网页下载。

我希望你会喜欢 Qt 6.2。让我们知道事情的进展并报告您可能发现的任何错误,以便在即将发布的补丁版本中使 Qt 6.2 变得更好。
欢迎关注微信公众号:Qt实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线zls12138

只看该作者 1楼 发表于: 2021-10-14
我爱rxr
离线steinlee

只看该作者 2楼 发表于: 2021-10-22
现在不可能喜欢6.2,还有很多问题。如果是做项目,千万别升级到6.2.自己练手可以的。至少还要等3-6个月才行。
Looking for remote C/C++ and Qt 兼职
离线angelus

只看该作者 3楼 发表于: 2021-11-06
6.2.1尝试移植,差点累吐血,然后放弃了,问题太多了,没有32位是个大问题,很多第三方动态库玩不起来
快速回复
限100 字节
 
上一个 下一个