Qt WebAssembly实验记录

2023-11-18

1.安装及介绍

【Qt杂谈2.快速体验Qt for WebAssembly(Windows平台)】
【qt for webassembly环境搭建图文教程】
【Qt:靠谱点了!基于WebAssembly开发网页端】

2.问题及解决方案

2.1.在C++中调用js函数

关于在wasm编译环境中,在c++中调用js,可以参考以下网址:
【emscripten.h】
【asm.js 和 Emscripten 入门教程】
【EM_JS : unable to free const char* in cpp】

2.2.中文无法显示(乱码):

【Qt for WebAssembly中文显示异常】
弄一个otf或者ttf字体文件,然后加到资源库中,然后

//注意选择你自己的文件
QFontDatabase::addApplicationFont(":/qml/Font/Alibaba-PuHuiTi-Light.otf");

2.3.无法输入中文

好像没有有效的资料解决这个问题,所以我只能调用html的api了
具体实现代码请看我另外一篇文章【QtWebAssembly实现中文输入】

#ifdef Q_OS_WASM
#include <emscripten.h>
#include <emscripten/html5.h>

//获取用户输入,因为Qt不支持直接输入中文。。
EM_JS(const char*, getInput, (const char *str), {
          const text = UTF8ToString(str);
          val = prompt("", text);

          if(val == null)
          {
              val = ""
          }
          var jstring = val;

          var lengthBytes = lengthBytesUTF8(jstring)+1;
          var stringOnWasmHeap = _malloc(lengthBytes);
          stringToUTF8(jstring, stringOnWasmHeap, lengthBytes);
          return stringOnWasmHeap;
      })
      
#endif

......
// 此函数可以作为静态函数,在适当的时候使用
// 调用此函数的效果为:在页面上弹出啊一个输出窗口,用户在输入好信息后,点击确定,窗口消失,此函数返回用户输入的字符串
QString Manager::getUserInput(QString currentText)
{
    QString input = "";

#ifdef Q_OS_WASM
    input = getInput(currentText.toUtf8().data());
#else

#endif

    return input;
}


2.4.qt对应的emsdk版本

【Qt for WebAssembly】在这里插入图片描述
设置的时候,直接在 Tools --》Options --》device–》webAssembly设置emsk的根目录就行。(记得在设置之前要先安装好python并设置好环境变量,因为QtCreator会调用)

假如在emsdk install 比较新的版本时,可能会出现:

D:\Qt\emsdk\emsdk>emsdk install 3.1.25
error: tool or SDK not found: '3.1.25'

此时可以先pull一下再install

D:\Qt\emsdk\emsdk>git pull

2.5.文件的下载以及上传:

【webassembly: support local system file access】
文件的下载(保存)可以选择用label显示下载链接(点击label后触发下载)。

    ui->label->setText("<a style='color: green;' href = https://download.qt.io/archive/online_installers/4.1/qt-unified-windows-x86-4.1.1-online.exe> click to download</a>");
    ui->label->setOpenExternalLinks(true);

或者选择稍微复杂一点的,通过wasm提供的接口,调用js实现。

#ifdef Q_OS_WASM
#include <emscripten.h>
#include <emscripten/html5.h>
#endif

//获取服务器的地址、端口之类的。
//这个EM_JS是用来声明js函数的,声明之后就可以直接在c++里面用了。
EM_JS(const char*, getTitle, (), {
          var urlPath = window.document.location.href;
          console.log(urlPath);

          var jstring = urlPath;

          var lengthBytes = lengthBytesUTF8(jstring)+1;
          var stringOnWasmHeap = _malloc(lengthBytes);
          stringToUTF8(jstring, stringOnWasmHeap, lengthBytes);
          return stringOnWasmHeap;
      })
      
void MainWindow::on_pushButton_download_clicked()
{

#ifdef Q_OS_WASM
    //执行js程序,这个是直接执行的。
    EM_ASM({
               window.open("http://127.0.0.1/resources/main.cpp");
    });
#endif

     //前面用EM_JS声明的函数
    const char *str = getTitle();
    qDebug() << str;
    free((void*)str);
}

文件的上传这样(这个是会读取整个文件内容的)

void something(const QString &name, const QByteArray &content)
{
    qDebug() << "name:" << name;
    qDebug() << "content" << content;
}
void MainWindow::on_pushButton_clicked()
{
//    QFileDialog::getSaveFileUrl();
//这个会打开选择的文件,然后将文件的名称以及内容通过上面的something来反馈出来。对于小文件的处理应该是够了。
    QFileDialog::getOpenFileContent("*", something);
}

2.6.设置调试时的网页浏览器

调试时默认为ie,可以更改为其他浏览器
在这里插入图片描述
假如你这里的列表有ie一个,但是实际上你已经装了其他浏览器;那么,你需要在电脑的环境变量path上加上你的浏览器的路径,然后重启QtCreator
在这里插入图片描述

2.7.编译时报空间太小

wasm-ld: error: initial memory too small, 18222032 bytes needed
【解决 wasm-ld: error: initial memory too small, 18319040 bytes needed】

修改emsdk/upstream/emscripten/src目录里面的settings.js
里面的 INITIAL_MEM 旧版叫 TOTAL_MEMORY

或者在pro文件中增加

#值为64KB的倍数
wasm:QMAKE_LFLAGS += -s \"TOTAL_MEMORY=33554432\"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt WebAssembly实验记录 的相关文章

  • 当 QML 对象不可见时防止 QML 属性绑定?

    我正在开发一个具有大量属性绑定的 QML 应用程序 数百个对象被跟踪并以不同的形式显示 例如 Qt3D QCanvas 当我在应用程序的单独页面上时 x y 位置和相对大小的属性绑定仍在发生 我怎样才能阻止他们 我知道我可以根据属性是否可视
  • 如何在 C++ 和 QML 应用程序中使用 qrc?

    我在 Windows7 上用 c qnd Qt Creator QML 编写了 Qt Quick Desktop 应用程序 现在 我必须部署它 并且我需要隐藏 qml 文件和图像 意味着 将它们放入资源等中 我读到有一个很好的方法可以使用
  • 程序意外完成 - QT Creator

    我正在尝试使用 QT Creator 使用 QT 框架开发 GUI 控制台应用程序 我使用的是Windows XP 我安装了QT 4 8 3和mingw 两者均已安装 没有任何错误 然后我安装了QT Creator QT 版本 路径中的 Q
  • (如何)我可以抑制未找到包配置文件的警告吗?

    我正在尝试创建一个CMakeLists txt尝试查找的文件Qt5 如果失败 则尝试回退到Qt4安装 该脚本到目前为止有效 但如果出现以下情况我总会收到警告Qt5未安装 注意FindQt5 cmake是由提供Qt5并且仅当以下情况时才可用Q
  • 如何在模型更改时停止ListView“跳跃”

    我需要做什么 我需要创建一个聊天窗口用一个ListView在 QML 中存储聊天消息 我设置listView positionViewAtEnd 以便跟踪最后的消息 我禁用positionViewAtEnd当我向上滚动时 我可以阅读过去的消
  • PyQt:如何设置组合框项目可检查?

    为了将 GUI 小部件数量保持在最低限度 我需要找到一种方法来为用户提供下拉菜单项的选择 这些菜单项可用于过滤掉 listWidget 项中显示的内容 假设 listWidget 列出了 5 个不同类别的项目 Cat A Cat B Cat
  • 如何在带有预编译头的项目中使用google protobuf

    我有一个包含多个项目的解决方案 我的项目 但不是全部 使用预编译头 我决定使用 protobuf 但遇到了一个问题 在 protoc exe 从 proto 生成 pb h 后 我尝试包含标头并收到错误 预编译标头未包含在 pb h 中 我
  • 加权 Voronoi 的 CGAL 2D APOLLONIUS 图 - 如何生成和获取面和顶点?

    我正在尝试根据阿波罗尼乌斯图生成加权沃罗诺伊 我正在使用 CGAL 库 我找不到如何从 apollonius 获取面和顶点的好例子 我有以下类型定义 typedef double NT typedef CGAL Cartesian lt N
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • 退出 Qt 程序的正确方法?

    我应该如何退出 Qt 程序 例如在加载数据文件时 发现文件损坏 并且用户需要退出该应用程序或重新启动数据文件 我是不是该 call exit EXIT FAILURE call QApplication quit call QCoreApp
  • Qt 布局,在小部件大小更改后调整到最小大小

    基本上我有一个QGridLayout里面有一些小部件 最重要的是 2 个标签 我用它们将图像绘制到屏幕上 好吧 如果用户愿意 他可以更改传入图像的分辨率 从而强制标签调整大小 我们假设标签的初始大小是320x240 用户将 VideoMod
  • Qt:如何连接到 SQLite?

    我安装了 SQLite3 解压到 c sqlite 创建了一个数据库 c sqlite mzsales 现在我试图在 QTableView 中显示其内容 QSqlDatabase db QSqlDatabase addDatabase QS
  • Qml 模块未找到 CPP 类注册与新的 QML_ELEMENT r

    我尝试使用 Qt5 15 0 和新宏 QML ELEMENT 在 QML 中注册我的自定义 CPP 类 但找不到该模块 Qt Creater 帮助文件描述了 QML ELEMENT 的步骤 我也检查了 Qt 手册 但没有幸福的结局 http
  • 如何检测QTableView中的双击

    我正在使用 PyQt 创建 GUI 应用程序 在继承自 QTableView 的视图中 需要检测用户双击行时选择的行 该表可以排序 但不能编辑 我该怎么做 注意 尝试了 doubleClicked int 信号 它是由鼠标按钮发出的 而不是
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • 如何使用meta-toolchain-qt5构建Qt(带有QtWebEngine支持)?

    我正在尝试使用构建 Qtmeta toolchain qt5 但是当我通过这样做时poky glibc x86 64 meta toolchain qt5 cortexa7hf vfp vfpv4 neon toolchain 2 0 1
  • QSerialPort 中的 readAll() 不包括最后发送的响应

    我正在使用 Qt 来控制串行设备 如果我向串行设备发送命令 我会执行类似的操作serial gt write command r n 我制作了一个按钮 它将纯文本小部件内的文本更改为串行端口的响应 为了获得串口的响应 我使用serial g
  • QML 连接:不推荐使用连接中隐式定义的 onFoo 属性

    升级到 Qt 5 15 时收到以下错误消息 QML Connections Implicitly defined onFoo properties in Connections are deprecated Use this syntax
  • Qt 5.3 无法使 QCompass (QSensor) 在 Windows 8.1 上工作

    我无法让传感器在我的 Asus Transformer T100 上工作 磁力计和指南针无法启动 并且我从加速度计获得假值 始终 x 0 y 9 8 z 0 即使使用我的笔记本电脑 我总是得到相同的结果 第一段文字编辑 Initialisa
  • 是否可以在 Qt Creator 中将 Qt 样式表与升级的小部件一起使用?

    我正在尝试使用 Qt 样式表对标准小部件进行一些重大的重新设计 因此 在为不同的小部件手动完成大部分工作之后 objectName选择器 我决定以某种方式对类似的小部件进行分组 例如我有多个QFrames其作用类似于内部表单中的标题 我希望

随机推荐

  • Kafka一致性

    一 存在的一致性问题 1 生产者和Kafka存储一致性的问题 即生产了多少条消息 就要成功保存多少条消息 不能丢失 不能重复 更重要的是不丢失 其实就是要确保消息写入成功 这可以通过acks 1来保证 保证所有ISR的副本都是一致的 即一条
  • CSP 202212-1 现值计算

    答题 主要就是 include
  • “无法从静态上下文中引用非静态变量,非静态方法”原因及解决

    1 原因 1 用static修饰的方法为静态方法 修饰变量则为静态变量 又分别叫做类方法或者类变量 这些从属于类 是类本身具备的 没有实例也会存在 2 而非静态方法和变量的存在依赖于对象 是对象的属性 需要先创建实例对象 然后通过对象调用
  • ★SQL注入漏洞(7)SQL注入高级篇

    分析目标防火墙并且跳过 1 直接拉黑ip类防火墙 2 过滤删除相应字符的防火墙 1 waf注释符号过滤 例题 Sqli labs T23 特点 注释符 被过滤掉了 绕过方法 逻辑上补全闭合即可 多加一次url编码只是更安全的绕过 selec
  • Redis系列1——数据类型和常用数据操作

    一 redis基础知识 客户端和服务器命令 默认端口号6379 服务器命令 redis server redis windows conf 设置服务一直开启 首先进入redis安装目录 然后执行 redis server service i
  • android so 调试

    安卓调试 环境 tool JDK 8X 之前用15版本的 monitor一直无法启动 链接 https pan baidu com s 12LUwB7ZOVEcblAzkO8hxyA 提取码 5lw0 monitor bat 流程 开启调试
  • mybatis学习笔记8:注解开发

    文章目录 一 基于注解的开发环境搭建以及实现查询所有 1 定义主配置文件 2 准备实体类和Dao接口 3 Dao接口定义findAll方法 以及添加注解 4 测试类定义方法测试 5 注解开发和基于xml的映射配置文件开发对比 6 注解开发的
  • 数据结构练习题——图(含应用题)

    1 选择题 1 在一个图中 所有顶点的度数之和等于图的边数的 倍 A 1 2 B 1 C 2 D 4 答案 C 2 在一个有向图中 所有顶点的入度之和等于所有顶点的出度之和的 倍 A 1 2 B 1 C 2 D 4 答案 B 解释 有向图所
  • 黄聪:微信小程序 服务器 TLS1.0 1TLS.2 配置详细教学!

    下载IISCrypto exe 点击best 工具自动推荐选中 也可以定义勾选 选择配置完成 然后点击 apply 软件弹窗提醒你 手动重启服务器 重启服务器 搞定 最后 https www ssllabs com ssltest inde
  • Linux与windows文件上传和下载

    在没有安装第三方工具的帮助下 能不能直接完成上传一个文件给服务器上 或者从服务器上下载一个文件下来 当然是可以的 你可以通过rz和sz来完成在自己的windows上上传一个文件给服务器 或者直接从服务器下载一个文件 首先第一步使用rz和sz
  • 三种SQL实现聚合字段合并(presto、hive、mysql)

    需求 按照项目名 以逗号合并参与人 presto select item name array join array agg name as group name from test test 04 group by item name o
  • Java版企业电子招标采购系统源代码Spring Boot + 二次开发 + 前后端分离 构建企业电子招采平台之立项流程图

    项目说明 随着公司的快速发展 企业人员和经营规模不断壮大 公司对内部招采管理的提升提出了更高的要求 在企业里建立一个公平 公开 公正的采购环境 最大限度控制采购成本至关重要 符合国家电子招投标法律法规及相关规范 以及审计监督要求 通过电子化
  • swagger注解之@ApiOperation

    swagger注解之 ApiOperation 链接 swagger学习一 链接 swagger学习二 ApiOperation 用于方法 表示一个http请求的操作 ApiOperation value 接口说明 httpMethod 接
  • 【Linux】Argument list too long参数列表过长的办法-四种

    1 背景 Linux下使用cp mv rm chmod等命令时经常会碰到 Argument list too long 错误 这主要是因为这些命令的参数太长 即文件个数过多 2 解决方案 方案一 将文件群手动划分为比较小的组合 user l
  • oracle 聚合函数 LISTAGG ,将多行结果合并成一行

    LISTAGG 列名 分割符号 oracle 11g 以上的版本才有的一个将指定列名的多行查询结果 用 指定的分割符号 合并成一行显示 例如 表原始数据 需求 将 mb1 Transport License list 表中的数据 根据 tr
  • 设计师winPE 更新支持Z370/Z390系列网卡 集成鲁大师远程协助QQ、检测工具、修复工具等懒得写自己看吧

    设计师winPE 更新支持Z370 Z390系列网卡 集成鲁大师远程协助QQ 检测工具 修复工具等懒得写自己看吧 网络远程版单机极速版 链接 https pan baidu com s 1BEraFYvtKNeqRkGljIbTtQ 提取码
  • 卷积运算转换为矩阵乘法

    看卷积神经网络的时候 发现代码中计算卷积是通过矩阵乘法来计算的 搜了一下发现网上这方面的资料很少 刚开始找中文的 找到两个 http blog csdn net anan1205 article details 12313593 http
  • 宽表, 窄表, 维度表, 事实表的区别

    在数据开发里 会涉及到一些概念 宽表 窄表 维度表 事实表 宽表 把多个维度的字段都放在一张表存储 增加数据冗余是为了减少关联 便于查询 查询一张表就可以查出不同维度的多个字段 窄表 和我们 mysql 普通表三范式相同 把相同维度的字段组
  • 信奥:1001Hello,World! 1002输出第二个整数 1003对齐输出

    include
  • Qt WebAssembly实验记录

    文章目录 1 安装及介绍 2 问题及解决方案 2 1 在C 中调用js函数 2 2 中文无法显示 乱码 2 3 无法输入中文 2 4 qt对应的emsdk版本 2 5 文件的下载以及上传 2 6 设置调试时的网页浏览器 2 7 编译时报空间