Qt WebAssembly实验记录

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\"
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 目前,Qt WebAssembly 不支持 QMultimedia 模块。这是因为 WebAssembly 平台上的浏览器环境不支持对音频和视频设备的直接访问,因此无法使用 QMultimedia 模块提供的音频和视频功能。不过,你可以尝试使用 Web API 中的 Web Audio API 和 WebRTC API 来实现音频和视频功能。 ### 回答2: Qt WebAssembly现在还不支持qMultimedia模块。Qt的qMultimedia模块用于处理多媒体功能,包括音频和视频播放、录制、流媒体等。在Qt WebAssembly中,目前只支持一些核心模块,如QtCore和QtGui,用于处理基本的UI和应用逻辑。由于WebAssembly的限制,目前还无法实现像qMultimedia这样的底层硬件访问和多媒体处理的功能。不过,Qt官方团队一直在努力将更多的模块和功能添加到Qt WebAssembly中,未来可能会支持qMultimedia或类似的多媒体模块。如果您需要在WebAssembly中实现多媒体功能,可能需要考虑使用其他库或技术来完成。 ### 回答3: Qt WebAssembly 是一种将 Qt 应用程序编译为 WebAssembly 格式的工具,使其能在现代的 Web 浏览器中运行。在 Qt WebAssembly 中,可以使用一些常见模块和类,比如 Qt Core、Qt GUI 和 Qt Widgets,以及一些附加功能。 然而,目前的 Qt WebAssembly 版本中并不支持 qMultimedia 模块。qMultimedia 是 Qt 的一个多媒体模块,用于处理音频和视频的播放和录制。它提供了一些类,如 QMediaPlayer、QAudioRecorder 和 QSound,可以用于控制多媒体资源的播放、暂停、停止和音量调节等操作。 有几个原因导致在当前的 Qt WebAssembly 中无法使用 qMultimedia 模块。首先,WebAssembly 的限制使得它无法直接访问设备的硬件资源,这意味着无法在浏览器中直接处理音频和视频流。其次,Web 浏览器本身提供了一些基本的多媒体功能,如 HTML5 的 audio 和 video 标签,因此 Qt WebAssembly 在处理这些功能时与浏览器进行了整合。 尽管当前版本的 Qt WebAssembly 不支持 qMultimedia 模块,但可以通过其他方式在 WebAssembly 中处理音频和视频。例如,可以使用 JavaScript 和 HTML5 的多媒体功能来实现相似的播放和录制操作。另外,可以考虑使用其他的前端技术,如 WebRTC 或 WebSocket,与后端服务器进行通信,从而在 WebAssembly 应用程序中实现音视频的传输和处理。 总之,当前版本的 Qt WebAssembly 不支持 qMultimedia 模块,但可以通过其他方式实现类似的功能。随着技术的发展和 Qt WebAssembly 的进一步更新,未来可能会加入对 qMultimedia 的支持。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值