Qt5.15.2實現Qt for WebAssembly與示例

目錄

1.什么是Qt for WebAssembly?

1.1 什么是 WebAssembly?

1.2 WebAssembly 的優勢

1.3 什么是 Qt for WebAssembly?

1.4 Qt for WebAssembly 的特點

1.5 編譯過程

1.6 運行時環境

注意!!!注意!!!注意!!!Qt版本和Emscripten版本有對應關系,在官方文檔里就給出了最適合的版本,比如Qt5.15.2和Emscripten1.39.8版本合適

2.環境準備

2.1 安裝python3.9.0

2.2 安裝 Qt for WebAssembly

2.3 配置 Emscripten

3.編譯生成

3.1 創建和編譯項目

3.2 在 Qt Creator 中創建一個新的 Qt 項目

3.3 編譯項目,生成?.wasm?和?.js?文件

4.運行示例

4.1 編譯生成內容

4.2 運行項目

5.遺留問題


1.什么是Qt for WebAssembly?

Qt for WebAssembly?是 Qt 框架的一個模塊,它允許開發者將 Qt 應用程序編譯為 WebAssembly(Wasm)格式,從而可以在現代 Web 瀏覽器中運行。WebAssembly 是一種低級的二進制指令格式,旨在為 Web 提供高性能的執行環境。通過 Qt for WebAssembly,開發者可以使用 Qt 的強大功能(如 GUI、網絡、文件系統等)來構建跨平臺的 Web 應用程序。

1.1 什么是 WebAssembly?

  • WebAssembly(Wasm)?是一種基于堆棧的虛擬機的二進制指令格式,旨在為 Web 提供高性能的執行環境。

  • 它允許開發者使用 C、C++、Rust 等語言編寫代碼,并將其編譯為 Wasm 格式,在瀏覽器中運行。

  • WebAssembly 的主要目標是實現接近原生的性能,同時保持與 Web 平臺的兼容性。

1.2 WebAssembly 的優勢

  • 高性能:接近原生的執行速度。

  • 跨平臺:可以在所有現代瀏覽器中運行。

  • 安全性:運行在瀏覽器的沙盒環境中,確保安全性。

  • 可移植性:支持多種編程語言(如 C、C++、Rust 等)。

1.3 什么是 Qt for WebAssembly?

  • Qt for WebAssembly?是 Qt 框架的一個模塊,它允許將 Qt 應用程序編譯為 WebAssembly 格式。

  • 通過 Qt for WebAssembly,開發者可以使用 Qt 的強大功能(如 GUI、網絡、文件系統等)來構建跨平臺的 Web 應用程序。

  • 它特別適合將現有的 Qt 桌面應用程序移植到 Web 平臺。

1.4 Qt for WebAssembly 的特點

  • 跨平臺:可以在所有現代瀏覽器中運行。

  • 高性能:利用 WebAssembly 的高性能特性。

  • 豐富的功能:支持 Qt 的核心模塊(如 Qt Core、Qt GUI、Qt Widgets 等)。

  • 易于移植:現有的 Qt 應用程序可以相對容易地移植到 WebAssembly。

1.5 編譯過程

  1. 使用 Emscripten 工具鏈將 Qt 應用程序的 C++ 代碼編譯為 WebAssembly 格式。

  2. 生成?.wasm?文件(WebAssembly 二進制文件)和?.js?文件(JavaScript 膠水代碼)。

  3. 通過 HTML 文件加載和運行 WebAssembly 應用程序。

1.6 運行時環境

  • WebAssembly 應用程序運行在瀏覽器的沙盒環境中。

  • Qt for WebAssembly 使用 Emscripten 提供的 API 與瀏覽器進行交互(如 DOM 操作、文件系統訪問等)。

人話就是把某些qt實現的桌面程序編譯成wasm支持的web形式,但存在局限性。

感興趣的也可以自己去看看:QT官方5.15.2的說明文檔

注意!!!注意!!!注意!!!Qt版本和Emscripten版本有對應關系,在官方文檔里就給出了最適合的版本,比如Qt5.15.2和Emscripten1.39.8版本合適

不然你可能在后面都配置好了之后,發現編譯報錯

[Makefile:74: .\TestWebAssembly.js] Error 1

具體原因這個博主解釋了,主要是js的語法適配問題

接下來我主要描述怎么在windows版本下進行環境準備。

2.環境準備

2.1 安裝python3.9.0

2.2 安裝 Qt for WebAssembly

  1. 下載并安裝 Qt 安裝程序(Qt 5.15 或更高版本)。

  2. 在安裝過程中,選擇?Qt for WebAssembly?模塊。

2.3 配置 Emscripten

  1. 下載并安裝 Emscripten 工具鏈。

先克隆Emscripten的sdk倉庫

git clone https://github.com/emscripten-core/emsdk.git

cd到剛剛克隆的文件夾下,進行安裝激活與查看版本,需要下載一些東西

.\emsdk install 1.39.8

.\emsdk activate 1.39.8

emcc --version

em++ --version

正確的情況下應該會看到:

2.配置 Emscripten 的環境變量。

自動利用腳本配置

.\emsdk_env.bat

手動配置

3.編譯生成

3.1 創建和編譯項目

1.在Qt中配置啟用webassembly編譯器

先要配置設備中的路徑,這個時候Qt自己會識別版本。

重啟QtCreator之后,就會在編譯器中看到有對應的版本的C和C++的編譯器

如果沒有的話,就自己添加

調試器的話,其實不支持調試,所以有沒有都無所謂,可以無視警告黃色感嘆號。

3.2 在 Qt Creator 中創建一個新的 Qt 項目

這個時候,可以勾選兩個編譯器,因為我使用的時候,切換到webassembly編譯器的時候,就無法加載出來pro中加入的文件了,可以先把項目運行好在切換成webassembly編譯器編譯就行。

選擇?WebAssembly?作為構建套件。

    3.3 編譯項目,生成?.wasm?和?.js?文件

    4.運行示例

    4.1 編譯生成內容

    TestWebAssembly/
    ├── TestWebAssembly.html ? ? ? # HTML 入口文件
    ├── TestWebAssembly.js ? ? ? ? # JavaScript 膠水代碼
    ├── TestWebAssembly.wasm ? ? ? # WebAssembly 二進制文件
    ├── TestWebAssembly.data ? ? ? # 靜態資源文件(可選)
    ├── TestWebAssembly.wasm.map ? # WebAssembly 源映射文件(可選)
    ├── TestWebAssembly.js.map ? ? # JavaScript 源映射文件(可選)
    └── TestWebAssembly.worker.js ?# Web Worker 文件(可選)

    4.2 運行項目

    如果走到這一步,你直接打開了html的話,就會看到這樣的畫面

    這就需要使用web服務器的方式加載才可以

    4.2.1使用 Web 服務器(如 Python 內置 HTTP 服務器)運行生成的?.html?文件。

    4.2.2在瀏覽器中打開?.html?文件,運行 WebAssembly 應用程序。

    http://localhost:8000/TestWebAssembly.html

    5.遺留問題

    出現了中文亂碼問題,尚未解決,看過一些教程,說是Qt自帶的三種字體并不支持中文,所以需要自己加載字體。

    Qt 字體加載、圖標字體的使用 | 解決 Qt for WebAssembly 中文字體問題_嗶哩嗶哩_bilibili

    希望知道怎么解決的朋友可以分享一下。

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/news/898193.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/news/898193.shtml
    英文地址,請注明出處:http://en.pswp.cn/news/898193.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    AGI大模型(8):提示詞的安全與防護

    1 前言 著名的「奶奶漏洞」,?套路把 AI 繞懵。 2 常?的提示詞攻擊技術 2.1 同類型?標劫持 同類?標劫持攻擊,特別是在同類型任務的背景下,涉及到攻擊者通過?法?段控制模型,并迫使其執行與原始任務性質相同但?標不同的操作…

    使用redis客戶端中對于json數據格式的存儲和讀取

    代碼背景: 現在有一個json格式的數據,但是由于redis客戶端上面沒辦法直接創建/導入json的數據格式。 故考慮現在redis客戶端上先存儲一個名為"old_order"的string類型的的源數據。 思路: 由于直接使用redisTemplate獲取自動導入…

    專題三搜索插入位置

    1.題目 題目分析: 給一個目標值,然后要在排序的整數數組中,找到跟目標值一樣的,如果沒有就把這個值插入進去,然后返回插入后的下標。 2.算法原理 根據題目的時間復雜度可以知道要用二分,開始劃分區域&…

    Redis監控:從睜眼瞎到千里眼的進化史

    各位在Redis迷霧中摸黑的探險家們!今天我們要給Redis裝上"天眼系統"——從連自己內存爆了都不知道的睜眼瞎,進化到連每秒哪個鍵被摸了幾次都門兒清的監控狂魔!準備好迎接《Redisの楚門世界》了嗎?👁? 第一幕…

    雙緩沖機制(含原理、優勢、實現方式、應用場景)

    雙緩沖機制 一、雙緩沖機制的原理二、雙緩沖的典型應用場景三、雙緩沖的優勢四、雙緩沖的實現方式1. 硬件級雙緩沖2. 軟件級雙緩沖3. 性能提升對比 五、雙緩沖的挑戰與解決方案六、總結 雙緩沖機制是一種通過使用兩個緩沖區(Buffer A 和 Buffer B)來優化…

    Linux 進程的創建、終止、等待與程序替換函數 保姆級講解

    目錄 一、 進程創建 fork函數 二、進程的終止: 1. 想明白:終止是在做什么? 2.進程終止的3種情況? a.退出碼是什么?存在原因?為什么int main()return 0? b.第三種進程終止的情況…

    深入了解Linux —— git三板斧

    版本控制器git 為了我們方便管理不同版本的文件,就有了版本控制器; 所謂的版本控制器,就是能夠了解到一個文件的歷史記錄(修改記錄);簡單來說就是記錄每一次的改動和版本迭代的一個管理系統,同…

    STM32---FreeRTOS事件標志組

    一、簡介 事件標志位:用一個位,來表示事件是否發生 事件標志組:一組事件標志位的集合,可以簡單的理解時間標志組,就是一個整體。 事件標志租的特點: 它的每一個位表示一個時間(高8位不算&…

    在centOS Linux系統搭建自動化構建工具Jenkins

    前言 在工作中發現公司使用Jenkins實現自動化部署項目方案,于是閑著自己也搗鼓一下,網上查閱相關部署資料,順便記錄操作步驟,所以有了下面這篇的文章。 部署完之后,安裝前端項目所需環境,比如node環境&am…

    Git下載安裝(保姆教程)

    目錄 1、Git下載 2、Git安裝(windows版) (1)啟動安裝程序 (2)閱讀許可協議 (3)選擇安裝路徑 (4)選擇組件 (5)選擇開始菜單文件夾…

    深入理解嵌入式開發中的三個重要工具:零長度數組、container_of 和 typeof

    在嵌入式開發中,內核開發者經常需要處理復雜的數據結構和動態內存分配。零長度數組、container_of 宏和 typeof 是內核開發中三個非常重要的工具,它們在結構體管理、內存操作和類型處理中發揮著關鍵作用。本文將詳細探討這三個工具的功能、應用場景及其在內核開發中的重要性。…

    【react】react中的<></>和React Fragment的用法及區別詳解

    目錄 1、<>是什么 2、為什么要使用<>&#xff1f; 3、如何使用<>&#xff1f; 基本用法 需要傳遞屬性時&#xff08;如key&#xff09; 使用效果 注意事項 總結 4、React Fragment 與空標簽&#xff08;<>&#xff09;詳解 1. Fragment 的用…

    【人工智能】使用Python實現時間序列異常檢測:從基礎到深度學習模型的全方位探索

    《Python OpenCV從菜鳥到高手》帶你進入圖像處理與計算機視覺的大門! 解鎖Python編程的無限可能:《奇妙的Python》帶你漫游代碼世界 時間序列異常檢測是數據分析領域中的重要課題,廣泛應用于金融、醫療、工業監控等多個行業。本篇文章深入探討了時間序列異常檢測的基本技術…

    Keytool常見問題全解析:從環境配置到公鑰提取

    引言 在Android開發、跨平臺應用構建&#xff08;如UniApp&#xff09;或服務端證書管理中&#xff0c;keytool 是一個不可或缺的工具。然而&#xff0c;許多開發者在使用 keytool 時&#xff0c;常因環境配置、路徑權限、密碼問題等導致操作失敗。本文基于真實問題場景&#…

    TSB - AD 解讀 — 邁向可靠、透明的 TSAD 任務

    目錄 一 文章動機 二 TSAD 領域內的兩類缺陷 三 數據集的構建 四 實驗結果及結論 項目宣傳鏈接&#xff1a;TSB-AD 代碼鏈接&#xff1a; TheDatumOrg/TSB-AD: TSB-AD: Towards A Reliable Time-Series Anomaly Detection Benchmark 原作者解讀&#xff1a;NeurIPS 2…

    DNS主從服務器

    1.1環境準備 作用系統IP主機名web 服務器redhat9.5192.168.33.8webDNS 主服務器redhat9.5192.168.33.18dns1DNS 從服務器redhat9.5192.168.33.28dns2客戶端redhat9.5192.168.33.7client 1.2修改主機名和IP地址 web服務器 [rootweb-8 ~]# hostnamectl hostname web [rootweb-8…

    遙感數據獲取、處理、分析到模型搭建全流程學習!DeepSeek、Python、OpenCV驅動空天地遙感數據分析

    【扔進數據&#xff0c;直接出結果】在科技飛速發展的時代&#xff0c;遙感數據的精準分析已經成為推動各行業智能決策的關鍵工具。從無人機監測農田到衛星數據支持氣候研究&#xff0c;空天地遙感數據正以前所未有的方式為科研和商業帶來深刻變革。然而&#xff0c;對于許多專…

    第一個vue項目

    項目目錄 啟動vue項目 npm run serve 1.vue.config.js文件 (CLI通過vue-cli-serve啟動項目&#xff0c;解析配置配置文件vue-condig-js&#xff09; // vue.config.js //引入path板塊&#xff0c;這是Node.js的一個內置模塊&#xff0c;用于處理文件路徑&#xff0c;這里引用…

    QT中讀取QSetting文件

    1.ini文件的格式 頭文件 #include <QSettings> #include <QStringList> #include <QtCore> #include <QDebug>2.讀文件 //ini文件的讀取 void iniTest::readIniFile(QString filePath) {//1.打開ini文件QSettings m_iniFile(filePath, QSettings::I…

    卷積神經網絡 - 一維卷積、二維卷積

    卷積(Convolution)&#xff0c;也叫褶積&#xff0c;是分析數學中一種重要的運算。在信號處理或圖像處理中&#xff0c;經常使用一維或二維卷積&#xff0c;本博文我們來學習一維卷積和二維卷積。 理解一維卷積和二維卷積的核心在于把握維度對特征提取方式的影響。我們從數學定…