之前有提到。我的是Qt5,我朋友的是Qt 6,由于版本不兼容问题,在迁移时会有问题。所以这一我们说说这两个的区别。(

正文开始喽!

总结来说:Qt5迁移至 Qt 6 需:1. 破坏性变更(必须修改代码)2. 模块和功能的变化3. 构建系统的变化

一、 破坏性变更(需要修改代码)

这些是您在将项目从 Qt 5 迁移到 Qt 6 时最可能遇到并必须修改代码的地方。

1. 对 C++ 标准的要求
  • Qt 5: 最低要求 C++11,但大部分模块仍兼容 C++98。

  • Qt 6强制要求 C++17 标准。这意味着您的编译器和代码都必须支持 C++17。这是 Qt 6 现代化改造的基础。

2. 图形架构的重大改变

这是最核心的差异之一,主要影响与图形渲染相关的代码(尤其是自定义的 QQuickItem 或使用 QPainter 的场景)。

  • Qt 5: 支持多种后端,如 OpenGL、DirectX、Software(软件渲染)。在 Qt Quick 2 中,场景图(Scene Graph)是基于 OpenGL 的。

  • Qt 6: 引入了 RHI(Rendering Hardware Interface) 抽象层。

    • 是什么:RHI 是一个位于 Qt Quick 场景图和具体图形 API(如 Vulkan、Metal、Direct3D、OpenGL)之间的薄抽象层。

    • 为什么:为了实现跨平台图形后端的统一和最佳性能(默认在 macOS 上使用 Metal,在 Windows 上使用 DirectX 12/Vulkan,在 Linux 上使用 Vulkan/OpenGL)。

    • 影响

      • 所有直接使用 OpenGL 调用的代码(例如 QOpenGLFunctionsQOpenGLFramebufferObjectQOpenGLShaderProgram)都需要重写,以使用 QRhi 及其相关类(如 QRhiTextureQRhiRenderBuffer 等)。

      • 自定义的 QQuickItem 或 QQuickFramebufferObject 需要适配新的渲染路径。

    • 兼容方案:Qt 6 提供了 rhi 模块和大量示例来展示如何在新架构下进行渲染。

3. QString 相关变化
  • QString::midQString::leftQString::right:

    • Qt 5: 返回 QString

    • Qt 6: 返回 QStringView。如果您需要 QString,可能需要显式构造或使用其他方法。

  • QStringRef 被移除:由 QStringView 替代。所有使用 QStringRef 的代码都需要替换。

4. QML 注册类型的变化
  • Qt 5: 使用 qmlRegisterType 函数族进行注册。

  • Qt 6强烈推荐使用新的宏 QML_ELEMENT 和 QML_NAMED_ELEMENT(<name>) 在类声明中直接注册。虽然旧的函数仍然存在,但新方式更简洁、更易于维护。

    • Qt 5:// main.cpp
      qmlRegisterType<MyObject>("MyModule", 1, 0, "MyObject");Qt 6:// myobject.h
      #include <QtQml/qqmlregistration.h>
      class MyObject : public QObject {Q_OBJECTQML_ELEMENT // 自动使用类名// 或 QML_NAMED_ELEMENT("MyObject") // 自定义名称...
      };
    • 然后在 CMake 中使用 qt6_add_qml_module 或在 QMake 中正确配置。

5. 容器类迭代器的行为变化
  • Qt 5QMapQHashQSet 等的迭代器行为类似于 std::mapit.key() 和 it.value() 用于访问键值对。

  • Qt 6: 为了与 C++ STL 保持一致,迭代器解引用(*it)现在返回的是 ,而不是一个键值对。

    • 对于 QMap 和 QHash*it 等价于 it.value()

    • 要获取键,仍然需要使用 it.key()

    • 这会影响基于范围的 for 循环:

      
      QMap<int, QString> map;
      // Qt 5 方式 (在Qt 6中错误)
      for (auto &pair : map) {// pair 是 QPair<int, QString> 或类似物int key = pair.key;   // 错误QString value = pair.value; // 错误
      }
      // Qt 5/6 通用正确方式
      for (auto it = map.begin(); it != map.end(); ++it) {int key = it.key();QString value = it.value(); // 或 *it
      }
      // Qt 6 基于范围for循环的正确方式
      for (auto &key : map.keys()) {QString value = map.value(key);
      }
      for (auto &value : map) { // *it 就是value,所以可以直接遍历值// ...
      }

二、 模块和功能的变化

1. 模块的移除和拆分

许多在 Qt 5 中处于“废弃”状态的模块在 Qt 6 中被正式移除。如果需要它们,必须单独安装或寻找替代方案。

  • 被移除的模块

    • QtScript: 已废弃,推荐使用 QJSEngine(在 QtQml 中)。

    • QtXmlPatterns: 已废弃,推荐使用 QXmlStreamReader 或第三方库。

    • QtQuick1 / QtDeclarative: QML 1.0 已被淘汰。

    • QtWebKit: 已被 QtWebEngine 取代(但 QtWebEngine 本身在 Qt 6.4 之前是附加模块,需要单独安装)。

    • QtQuickControls1: 已被 Qt Quick Controls 2 取代。

  • 变为附加模块(需要单独安装):

    • QtWebEngine: 提供浏览器功能。

    • QtSerialPortQtBluetoothQtSensors 等许多不属于核心框架的模块都变成了附加模块。

2. 新的核心模块
  • QtCore5Compat: 这是一个至关重要的兼容性模块。它包含了许多从 Qt 5 核心模块中移除但为了兼容性而保留的类,例如:

    • QRegExp (推荐使用 QRegularExpression)

    • QTextCodec 及其子类

    • QStringRef (已被 QStringView 取代)

    • 旧版本的 QDateTime API

    • 如果您遇到 QRegExp 等类找不到链接的错误,通常需要在 .pro 文件(QT += core5compat)或 CMakeLists.txtfind_package(Qt6 COMPONENTS Core5Compat))中添加这个模块。

3. API 的清理和废弃

许多在 Qt 5 中被标记为“废弃”的旧 API 在 Qt 6 中被彻底移除。编译器会直接报错。

  • 常见例子

    • QColor::light() / QColor::dark() -> 使用 QColor::lighter() / QColor::darker()

    • qVariantFromValue() -> 使用 QVariant::fromValue()

    • QFontMetrics::width() -> 使用 QFontMetrics::horizontalAdvance()


三、 构建系统的变化

1. QMake 到 CMake 的转变
  • Qt 5: 主要支持和推荐使用 QMake (.pro 文件)。

  • Qt 6官方强烈推荐并主要支持使用 CMake。虽然仍然支持 QMake,但所有新的特性和开发都优先面向 CMake。Qt 官方提供的许多工具和集成(如用于 QML 的 qt6_add_qml_module)都是为 CMake 设计的。

2. 新的 QML 模块构建系统
  • 在 Qt 6 中,使用 CMake 管理 QML 模块、资源(qmldirqrc 文件)变得更加简单和强大,通过 qt6_add_qml_module 宏可以一站式处理类型注册、资源打包和模块发现。


迁移建议和总结

  1. 检查编译器:确保您的编译器支持 C++17。

  2. 使用端口工具:运行 qt6_porting_tools 中的 configure 和 cmake 脚本来分析您的代码,它们能识别出许多常见的兼容性问题。

  3. 逐模块处理

    • 首先处理核心模块(QtCore, QtGui, QtWidgets)的编译错误(如废弃的 API)。

    • 然后重点关注图形相关代码(OpenGL -> RHI)。

    • 接着处理 QML 注册和 QML 相关代码。

  4. 添加 Core5Compat 模块:如果遇到 QRegExp 等链接错误,这是最快的解决方案。

  5. 查阅官方文档:Qt 官方提供了非常详细的 Porting from Qt 5 to Qt 6 指南,这是最权威的参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/94716.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/94716.shtml
英文地址,请注明出处:http://en.pswp.cn/web/94716.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

本地windows电脑部署html网页到互联网:html+node.js+ngrok/natapp

目录 核心概念&#xff1a;为什么不能直接分享HTML文件&#xff1f; 1&#xff0c;html文件修改 2&#xff0c;安装设置node.js 3&#xff0c;路由器虚拟服务器 4&#xff0c;采用ngrok工具进行内网穿透&#xff08;国外工具&#xff09; 5&#xff0c;采用natapp工具进行…

electron离线开发核心环境变量npm_config_cache

npm_config_cache 这个环境变量。它在离线环境配置中扮演着核心角色。什么是 npm_config_cache&#xff1f;npm_config_cache 是一个环境变量&#xff0c;用于直接设置 npm 的缓存目录的绝对路径。npm 在安装包时&#xff0c;会遵循一个特定的工作流程&#xff1a;检查缓存&…

CTFshow系列——命令执行web57-60

本篇文章介绍命令执行的另一种情况&#xff0c;CTFshow的Web57-60关的讲解解析&#xff1b;要想了解其它关卡可查看我以往的文章&#xff0c;感谢关注。 文章目录Web57&#xff08;新方法&#xff09;Web58&#xff08;POST型&#xff09;不可用函数可用函数Web59第二种方法&am…

域名、ip、DSN、URL

目录 1、ip 2、域名 3、DSN 4、URL 1、ip 每个连接到Internet上的主机都会分配一个IP地址&#xff0c;此ip是该计算机在互联网上的逻辑地址的唯一标识&#xff0c;计算机之间的访问就是通过IP地址来进行的。写法&#xff1a;十进制的形式&#xff0c;用“.”分开&#xff0…

【JAVA实现websocket】

JAVA实现websocket背景依赖问题代码实现测试背景 近期项目中需要用到websocket&#xff0c;实现即时通信。 依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></depen…

2.6 提示词调优编码实战(一)

目录 写在前面 一,需求定义 二,简单提示词 2.1 代码示例 2.2 输出结果 三,提示词模版 3.1 提示词 3.1.1 任务描述 3.1.2 用户输入 3.1.3 模型输出格式 3.1.4 Prompt模版 3.2 输出结果 写在前面 前面我们总结了提示词对于模型的意义,接下来我们来通过向模型输入…

使用Stone 3D快速制作第一人称视角在线小游戏

首先得有个怪物模型&#xff0c;怪物带有idle, attack动作 然后有个场景模型&#xff0c;把怪物&#xff08;如果模型较大&#xff0c;建议使用remote-mesh来加载&#xff09;摆放到想放的位置。 给相机加上fps-controls和character组件 给所有怪物加上character组件 可以在…

嵌入式第三十七课!!!TCP机制与HTTP协议

TCP的其他机制TCP头部标志位SYN&#xff1a;请求建立连接标志位 ACK&#xff1a;响应报文标志位 PSH&#xff1a;携带数据标志位&#xff0c;通知接收方该从缓冲区读数据 FIN&#xff1a; 请求断开连接标志位 RST&#xff1a;复位标志位 URG: 紧急数据标志…

【测试】pytest测试环境搭建

使用pytest进行API测试&#xff0c;vscode运行 创建虚拟环境&#xff0c;安装pytest&#xff0c;httpx&#xff0c;requests&#xff0c;dotenvvscode中ctrlshiftp&#xff0c;选择python: Configure Tests&#xff0c;选择pytest&#xff0c;目录左侧插件testing里面可以看到有…

javaweb开发笔记——微头条项目开发

第八章 微头条项目开发 一 项目简介 1.1 微头条业务简介 微头条新闻发布和浏览平台,主要包含业务如下 用户功能 注册功能 登录功能 头条新闻 新闻的分页浏览 通过标题关键字搜索新闻 查看新闻详情 新闻的修改和删除 权限控制 用户只能修改和自己发布的头条新闻 1.…

Linux(二十二)——服务器初始化指南

文章目录前言一、配置国内 Yum 源&#xff08;加速软件安装&#xff09;二、更新系统与安装必备工具三、网络连接验证四、配置主机名五、同步时间六、配置防火墙6.1 使用 iptables6.1.1 整体思路6.1.2 详细步骤6.1.3 完整配置脚本示例6.1.4 常用管理命令6.2 使用 firewalld总结…

我用Photoshop Firefly+Blender,拯救被环境毁掉的人像大片

今日阳光正好。这样的天气对于摄影师来说是种馈赠&#xff0c;但也让我想起了这个行业最普遍也最无奈的痛点&#xff1a;我们精心策划了一场拍摄&#xff0c;模特的表现、光线的质感都近乎完美&#xff0c;但最终却因为一个平淡的阴天、一处杂乱的背景&#xff0c;或是一个无法…

【线性代数】常见矩阵类型

目录 1. 方阵(Square Matrix) 2. 对称矩阵(Symmetric Matrix) 3. 反对称矩阵 / 斜对称矩阵(Skew-Symmetric Matrix) 4. 对角矩阵(Diagonal Matrix) 5. 三角矩阵 6. 正交矩阵(Orthogonal Matrix) 7. 幂等矩阵(Idempotent Matrix) 8. 正定矩阵 / 半正定矩阵 …

达梦数据库统计信息收集

达梦数据库统计信息收集 检查统计信息收集情况 如何手动收集统计信息 查看统计信息收集结果 统计信息手动收集策略 统计信息的自动收集 检查统计信息收集情况 检查最近一次统计信息收集时间: --表的最近一次统计信息收集时间 SQL> select owner,table_name,last_analyzed…

【目标检测】论文阅读4

Fast and accurate object detector for autonomous driving based on improved YOLOv5 发表时间&#xff1a;2023年&#xff1b;期刊&#xff1a;scientific reports 论文地址 摘要 自动驾驶是人工智能的一个重要分支&#xff0c;实时准确的目标检测是保证自动驾驶车辆安全稳…

wpf之DockPanel

前言 DockPanel是一个容器控件&#xff0c;容器中的子控件通过设置DockPanel.Dock属性来调整位置 1、DockPanel.Dock DockPanel.Dock的值有Left、Right、Top、Bottom 1.1 Left 指示控件靠左停靠 1.2 Right 指示控件靠右停靠 1.3 Top 指示控件靠上停靠 1.4 Bottom 指示…

解决VSCode中Cline插件的Git锁文件冲突问题

文章目录 问题现象 错误分析 解决方案 方法一:手动删除锁文件(推荐) 方法二:检查并终止Git进程 方法三:重置检查点目录 方法四:完全重新初始化 预防措施 总结 在使用VSCode进行开发时,许多开发者会选择安装Cline插件来提升工作效率。然而,在使用过程中,可能会遇到一些…

视频合成素材视频-多合一功能-青柠剪吧

剪辑繁琐耗时&#xff1f;这款工具正在改变创作者的日常。最近很多人都在用的剪辑神器&#xff0c;叫青柠剪吧。它尤其适合需要批量处理视频的朋友&#xff0c;内置40多项功能&#xff0c;从替换、分割到对齐、导出&#xff0c;基本覆盖了剪辑全流程。操作简单&#xff0c;哪怕…

未成功:使用 Nginx 搭建代理服务器(正向代理 HTTPS 网站)

下载 nginx: download 解压配置http 编译conf/nginx.conf http {server {listen 8080; # 代理服务器监听端口resolver 8.8.8.8; # DNS 解析器location / {proxy_pass $scheme://$host$request_uri; # 转发请求proxy_set_header Host $host;proxy_set_header X-Real-IP $…

【Python】新手入门:Python标准库有哪些常用模块?

🌈 个人主页:(时光煮雨) 🔥 高质量专栏:vulnhub靶机渗透测试 👈 希望得到您的订阅和支持~ 💡 创作高质量博文(平均质量分95+),分享更多关于网络安全、Python领域的优质内容!(希望得到您的关注~) 🌵文章目录🌵 前言 💡一、操作系统接口 📝二、文件通配符…