标题:Qt项目升级到Qt6经验总结
作者:liudianwu
日期:2022-03-06 11:12
内容:
## 1 直观总结
1. 增加了很多轮子,同时原有模块拆分的也更细致,估计为了方便拓展个管理。
2. 把一些过度封装的东西移除了(比如同样的功能有多个函数),保证了只有一个函数执行该功能。
3. 把一些Qt5中兼容Qt4的方法废弃了,必须用Qt5中对应的新的函数。
4. 跟随时代脚步,增加了不少新特性以满足日益增长的客户需求。
5. 对某些模块和类型及处理进行了革命性的重写,运行效率提高不少。
6. 有参数类型的变化,比如 long * 到 qintptr * 等,更加适应后续的拓展以及同时对32 64位不同系统的兼容。
7. 源码中的double数据类型全部换成了qreal,和Qt内部数据类型高度一致和统一。
8. 我测试的都是QWidget部分,quick部分没有测试,估计quick部分更新可能会更多。
9. 强烈建议暂时不要用Qt6.0到Qt6.2之间的版本,一些模块还缺失,相对来说BUG也比较多,推荐6.2.2版本开始正式迁移。
## 2 经验总结
1. 万能方法:安装5.15版本,定位到报错的函数,切换到源码头文件,可以看到对应提示字样 QT_DEPRECATED_X("Use sizeInBytes") 和新函数。按照这个提示类修改就没错,一些函数是从Qt5.7 5.9 5.10等版本新增加的,可能你的项目还用的Qt4的方法,但是Qt6以前都兼容这些旧方法,到了Qt6就彻底需要用新方法了。
2. Qt6对core这个核心类进行了拆分,多出来core5compat,因此你需要在pro增加对应的模块已经代码中引入对应的头文件。
```cpp
//pro文件引入模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat
//代码中引入头文件
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
#include
#endif
#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
#include
#endif
```
3. 默认Qt6开启了高分屏支持,界面会变得很大,甚至字体发虚,很多人会不习惯,因为这种模式如果程序很多坐标计算没有采用devicePixelRatio进行运算的话,100%会出现奇奇怪怪的问题,因为坐标不准确了。要取消这种效果可以设置高分屏缩放因子。
```cpp
#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::Floor);
#endif
```
4. 原有的随机数函数提示用QRandomGenerator替代,为了兼容所有qt版本,改动最小的办法是直接用c++中的随机数,比如qsrand函数 ..
#1 [fsu0413 03-06 16:56]
QtCore5Compat里好多都是现在被弃用的东西,类似Qt4时期的Qt3Support一样
包括文件编码,QXmlReader,二进制编码的QJsonDocument,QRegExp,QLinkedList
其中我觉得可能影响最大的是QRegExp。
Qt官方给的解决方案是用QRegularExpression。这个类从Qt5.6就有了,不过用法和QRegExp不太一样。
如果适配了QRegularExpression,基本就可以和Core5Compat说拜拜了。
剩下的,文件编码基本用外部库了
QXmlReader 用QXmlStreamReader代替
二进制编码的QJsonDocument没有替代品,不过我觉得也用不着,实际用例约等于没有(可能吧?)
QLinkedList 用std::list,功能完全一致