Qt5.15.2实现Qt for WebAssembly与示例

news2025/3/26 4:25:54

目录

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.coloradmin.cn/o/2320637.html

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

    相关文章

    好吧好吧,看一下达梦的模式与用户的关系

    单凭个人感觉,模式在达梦中属于逻辑对象合集,回头再看资料 应该是一个用户可以对应多个模式 问题来了,模式的ID和用户的ID一样吗? 不一样 SELECT USER_ID,USERNAME FROM DBA_USERS WHERE USERNAMETEST1; SELECT ID AS SCHID, NA…

    HOW - DP 动态规划系列(三)(含01背包问题)

    目录 一、01背包问题最直接的暴力解法动态规划解法 二、完全背包 通过几个算法的学习,理解和掌握动态规划来解决背包问题。 一、01背包问题 对于面试的话,掌握01背包和完全背包就够用了,最多可以再来一个多重背包。 如果这几种背包分不清&…

    在linux服务器部署Heygem

    前言: Heygem官方文档上提供了基于windwos系统的安装方案。在实际使用过程中个人电脑的配置可能不够。这个时候如果服务器配置够的话,可以尝试在服务器上装一下。但是服务器一般都是linux系统的,于是这篇教程就出现了… 可行性分析 通读安装…

    图书管理系统系统-Java、SpringBoot、Vue和MySQL开发的图书馆管理系统

    「springboot、vue图书馆管理系统.zip」 链接:https://pan.quark.cn/s/5a929a7e9450 分享一个图书管理系统,Java、SpringBoot、Vue和MySQL开发的图书馆管理系统 以下是对文本内容的总结: 项目概述 项目名称与背景: 项目概述 项…

    [c语言日寄]数据输入

    【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…

    字节DAPO算法:改进DeepSeek的GRPO算法-解锁大规模LLM强化学习的新篇章(代码实现)

    DAPO算法:解锁大规模LLM强化学习的新篇章 近年来,大规模语言模型(LLM)在推理任务上的表现令人瞩目,尤其是在数学竞赛(如AIME)和编程任务中,强化学习(RL)成为…

    计算机操作系统(四) 操作系统的结构与系统调用

    计算机操作系统(四) 操作系统的结构与系统调用 前言一、操作系统的结构1.1 简单结构1.2 模块化结构1.3 分层化结构1.4 微内核结构1.5 外核结构 二、系统调用1.1 系统调用的基本概念1.2 系统调用的类型 总结(核心概念速记)&#xf…

    DeepSeek技术架构解析:MoE混合专家模型

    一、前言 2025年初,DeepSeek V3以557万美元的研发成本(仅为GPT-4的1/14)和开源模型第一的排名,在全球AI领域掀起波澜。其核心创新之一——混合专家模型(Mixture of Experts, MoE)的优化设计,不…

    【正点原子】AI人工智能深度学习(RV1126/RK3568/RK3588)-第1期 准备篇

    1.1SDK编译后的目录 1、真正的根文件系统镜像存放目录 2、非必须,负责系统升级等,kerneldtbramdisk组成的根文件系统 1.2文件系统分区 1.3开机自启动 1.6设置静态ip地址 1.8RKMedia框架/编译测试SDK自带RKMedia例程 出厂系统以下内容都是默认…

    靶场(十五)---小白心得思路分析---LaVita

    启程: 扫描端口,发现开放22,80端口,发现ws.css可能存在exp,经查发现无可利用的exp PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.4p1 Debian 5deb11u2 (protocol 2.0) | ssh-hostkey: | 3072 c9…

    【AI大模型】DeepSeek + 通义万相高效制作AI视频实战详解

    目录 一、前言 二、AI视频概述 2.1 什么是AI视频 2.2 AI视频核心特点 2.3 AI视频应用场景 三、通义万相介绍 3.1 通义万相概述 3.1.1 什么是通义万相 3.2 通义万相核心特点 3.3 通义万相技术特点 3.4 通义万相应用场景 四、DeepSeek 通义万相制作AI视频流程 4.1 D…

    Pi型隶属函数(Π-shaped Membership Function)的详细介绍及python示例

    我们前文已经深度解读了三角形、梯形、高斯、S型和Z型隶属函数,现在转向Pi型。当然我们先简要回顾不同隶属函数的特点和曲线效果。了解每种隶属函数的特性是为了更好的应用。 一、回顾五种隶属函数的特点 1.从每种隶属函数的结构和特点角度对比。三角形隶属函数&am…

    MySQL 入门大全:常用函数

    🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…

    SpringBoot3实战(SpringBoot3+Vue3基本增删改查、前后端通信交互、配置后端跨域请求、数据批量删除(超详细))(3)

    目录 一、从0快速搭建SpringBoot3工程、SpringBoot3集成MyBatis、PageHelper分页查询的详细教程。(博客链接) 二、实现前端与后端通信对接数据。(axios工具) &#xff08;1&#xff09;安装axios。(vue工程目录) &#xff08;2&#xff09;封装请求工具类。(request.js) <1&…

    JVM垃圾回收笔记02-垃圾回收器

    文章目录 前言1.串行(Serial 收集器/Serial Old 收集器)Serial 收集器Serial Old 收集器相关参数-XX:UseSerialGC 2.吞吐量优先(Parallel Scavenge 收集器/Parallel Old 收集器)Parallel Scavenge 收集器Parallel Old 收集器相关参数-XX:UseParallelGC ~ -XX:UseParallelOldGC-…

    Linux上位机开发实战(编写API库)

    【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 我们自己编写linux上位机软件的时候&#xff0c;尽量都是通过框架库的形式来开发。这就是所谓的低耦合&#xff0c;高内聚。相似的功能、模块和算法…

    器件功耗模型原理

    器件功耗模型原理 谷歌提供了一套通用的器件耗电模型和配置方案&#xff0c;先对器件进行耗电因子拆解&#xff0c;建立器件功耗模型&#xff0c;得到一个器件耗电的计算公式。通过运行时统计器件的使用数据&#xff0c;代入功耗模型&#xff0c;就可以计算出器件的功耗。例如…

    拥抱成长型思维:解锁持续进步的人生密码

    我强烈推荐4本可以改变命运的经典著作&#xff1a; 《寿康宝鉴》在线阅读白话文《欲海回狂》在线阅读白话文《阴律无情》在线阅读白话文《了凡四训》在线阅读白话文 一、什么是成长型思维&#xff1f; 成长型思维&#xff08;Growth Mindset&#xff09;由斯坦福大学心理学家卡…

    Ubuntu上查看GPU使用情况并释放内存

    先用nvidia-smi查看GPU当前使用情况 再用fuser 命令查找对应显卡上占用 GPU 的进程 最后查到了用kill -9强制杀掉进程&#xff08;PID&#xff09;即可

    解决思科交换机无法访问局域网外设备

    问题背景 有时&#xff0c;我们需要远程连接来管理一台思科交换机&#xff0c;例如使用SSH协议。然而交换机运作在链路层&#xff0c;这就需要交换机有一个网络层地址&#xff0c;来接纳基于IP协议的远程访问请求。于是&#xff0c;我们依靠设置一个带有IP地址的交换机虚拟接口…