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.mzph.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;本博文我们来学习一维卷积和二维卷积。 理解一维卷积和二维卷积的核心在于把握维度对特征提取方式的影响。我们从数学定…