Qt 6 與 Qt 5 存在的兼容性差異

之前有提到。我的是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 調用的代碼(例如?QOpenGLFunctions,?QOpenGLFramebufferObject,?QOpenGLShaderProgram)都需要重寫,以使用?QRhi?及其相關類(如?QRhiTexture,?QRhiRenderBuffer?等)。

      • 自定義的?QQuickItem?或?QQuickFramebufferObject?需要適配新的渲染路徑。

    • 兼容方案:Qt 6 提供了?rhi?模塊和大量示例來展示如何在新架構下進行渲染。

3.?QString 相關變化
  • QString::mid,?QString::left,?QString::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 5:?QMap,?QHash,?QSet?等的迭代器行為類似于?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: 提供瀏覽器功能。

    • QtSerialPort,?QtBluetooth,?QtSensors?等許多不屬于核心框架的模塊都變成了附加模塊。

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 模塊、資源(qmldir,?qrc?文件)變得更加簡單和強大,通過?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領域的優質內容!(希望得到您的關注~) ??文章目錄?? 前言 ??一、操作系統接口 ??二、文件通配符…