Qt框架的一个新的长期支持版本6.5最近发布。它为以前的版本引入了许多修复、改进和新功能。有些可能对您的应用程序有用(如果不是现在,可能会在将来),因此最好将应用程序迁移到最新版本的框架。
仍然有许多应用程序仍在使用Qt 5,因此直接迁移到最新版本的框架并不容易。在本文中主要指出从Qt 5顺利迁移到Qt 6的最关键步骤。
那么,为什么是Qt 6呢?
- 改进了性能。Qt 6引入了一个新的渲染管线,可以提高性能并减少内存使用量,从而产生更快、响应更快的应用程序。
- 改进的 QML。QML 已得到增强,性能更好,改进了对将C++类导出到 QML 的支持,以及用于调试 QML 代码的更强大的工具。新的Qt快速编译器允许您预编译QML文件,以加快启动时间。
- 改进的模块。一些模块已被重写和改进,例如Qt Quick 3D,Qt Multimedia和Qt WebEngine。使用这些模块的最新版本将确保您的应用程序符合当前标准。
- 附加模块。许多模块将作为附加组件提供。它将使Qt二进制文件更小,并允许您仅在项目中需要时才下载模块。
- 统一后端。Qt 6提供了一个API来访问多个环境中特定于平台的功能。这包括图形、多媒体、输入和窗口系统。
- 长期支持。Qt 5已经到了它的生命周期,虽然某些旧版本仍然有安全和错误修复,但任何新的特性或功能都只能在Qt 6中使用。如果您不希望您的应用程序过时得太快,您应该进行迁移。
这些是确保使用最新版本的Qt 6使您的应用程序与最新功能保持同步的主要内容。应用程序的性能将比以前更好,并且将来维护应用程序将更容易。
迁移到Qt 6的路径
第 1 步。QT 移植到 QT 5.15
将应用程序移植到Qt 5的最新版本,然后切换到Qt 6要容易得多。这是因为Qt在6.5版本中只发布了简化迁移到Qt 5.15的机制。从Qt 5的先前版本迁移到最新版本的Qt 5应该很简单。
第 2 步。检查模块更改
在Qt 6中,Qt 5中提供的某些模块不再可用。这些模块将被删除、重命名或合并到不同的模块中。在最新版本中,几个已删除的模块已经刷新并添加到框架中。
通过检查模块更改,可以确保应用程序在迁移后按预期工作。当模块不再存在时,关于如何表现的可能解决方案可能会有所不同。下面是几个已弃用模块的示例,以及如何更新使用它们的代码。
- Qt 快速控制 1 → 使用新的 Qt 快速控制 2
- Qt Multimedia Widgets → 使用 Qt Multimedia 的 QML API
- Qt 图形效果 → 使用 Qt5Compat 模块(Qt Quick MultiEffect 从 Qt 6.5 开始)
因此,取决于需要替换的模块。删除模块和其他更改的完整列表可以在Qt文档中找到。
“是否需要检查文档中每个模块的更改?”
没必要。它可以帮助您找到已弃用API的正确替代品,但Qt creator工具可以提示不再受支持的代码的所有部分。请看步骤4.
第 3 步。QT移植:检查您的环境
Qt 6需要C++17或更高版本的编译器(例如,对于Windows – MinGW 8.1.0或msvc 2019),因此如果您使用的是旧版本,则是时候升级了。Qt公司开发的工具也支持Qt 6,因为特定版本。对于Qt Creator,它是4.14,对于Qt Design Studio,它是2.0。
如果安装了正确的编译器和工具,则为 Qt 6 准备的应用程序应在移植后正确构建和运行。
第 4 步。执行移植到 QT 6
摆脱已弃用的功能。
在Qt 5.15中,Qt 6中不包含的所有内容都被标记为已弃用。默认情况下,此代码的使用将作为编译器警告弹出。但是也可以选择将其视为错误。
要确保这一点,需要定义它应设置为指定宏时,已弃用的功能(在给定版本的Qt或任何更早版本中)将被禁用。QT_DISABLE_DEPRECATED_BEFORE
0x050F00
如果在生成过程中看到任何错误,则应重构该部分。
不带宏的输出。应用已正确构建。
使用宏输出。无法构建应用。
运行冲突并摆脱这些警告。
Clazy 是一个静态分析工具,可作为 QtCreator 中的插件使用。Clazy 可以分析代码并向您展示需要改进的地方。可以明确地告诉 Clazy 在执行过程中要检查什么。需要检查一些特殊选项,这些选项可以指向Qt 6中不支持的代码部分。Clazy 也能够自动修复这些警告。
在移植过程中有用的选项:
qt6-deprecated-api-fixes
qt6-header-fixes
qt6-qhash-signature
qt6-fwd-fixes
missing-qobject-macro
可以在首选项→分析器→Clang工具→诊断配置中更改延迟配置。
在移植过程中有用的选项:
输出示例。
必要时使用 Qt5Compat 模块。
在第2步中,提到了一个名为Qt5Compat模块?
引入该模块是为了更好的进行迁移和过渡。它提供了Qt 6中消失的一些类,例如QRegExp和QStringRef,但由于这一点,它仍然可以在Qt 6应用程序中使用。比如某些模块在Qt 6中消失了,但将在下一个版本中作为MultiEffect重新引入。因此,在此期间,可以暂时使用Qt5Compat模块来确保兼容性。但是当MultiEffect模块可用时,应该重写代码以切断过时的API。
如何将模块导入到项目中:
头文件包含也需要更改:
最后,请做好相关测试。