原文作者:Lorn Potter ,自由开发者,之前曾经在Trolltech、Nokia、Jolla、Canonical和Intopalo工作。在Qt Project中,担任QSensors和QSystemInfo模块的维护者,还参与了QBearerManagement的工作。
校审:Richard Lin
您可能已看到Qt 开源项目发布Qt for WebAssembly 技术预览版这则消息。
我们用 Emscripten 把Qt编译成可以从web服务器下载到浏览器中运行的形式。我们的目标是能为任何安装了支持WebAssembly浏览器的平台编译、部署Qt应用到web服务器上,不再需要编译、部署到多个系统。如果您是企业用户,并有多个同时运行各种平台的客户端,您可以使用Qt for WebAssembly来编译您的Qt或Quick程序,只要部署一次即可。
Qt for WebAssembly的搭建指导说明参请见 Qt for WebAssembly wiki 。首先,您需要下载并安装 emsdk编译器。过程有点琐碎,它是我们的交叉编译器。
调试过程有些麻烦,因为浏览器中没有gdb,但是会有状态输出(std::cout,qDebug以及printf)以及浏览器的调试控制台。您可能还需要把网页控制台记录行数上限调高,通过(Firefox)在about:config页面中修改“devtools.hud.loglimit.console”。
在代码中添加
EM_ASM({ debugger });
可以弹出浏览器调试器,作为设置断点的手段。(别忘了#include<emscripten.h>)。不方便的是您需要重新编译。
不是所有都能完美运行,但以下是一些成功运行示例的屏幕截图:
QOpenGLWindow能够运行,并且接近60fps,尽管现在它们是“全屏”,也就意味着它们将占据整个浏览器窗口。QOpenGLWidget仍然有一些问题,有些着色器看上去有些问题。
Emscripten把OpenGL的调用翻译成WebGL,因此对于桌面和嵌入式版本有一定限制。
除了使用‘wip/webassembly’分支的QtBase和QtDeclarative模块,运行顺利的Qt模块还有:
如果要使用QtMqtt,您需要从QtMqtt的websocketsubscription示例中集成WebSocketIODevice类到您的应用。
还有一个正在开发中(WIP)的合并请求(MR),主要是关于QtSensors模块后台,实现移动端(包括笔记本电脑)的屏幕方向随重力改变功能。它已经编译通过但还需要测试。
因为javascript和webassembly只有一个线程,QtDeclarative只能工作在单线程中。
QtCharts、QtGraphicalEffects、QtQuickcontrols、QtQuickControls2 都能直接运行、无需改变。
有一个正在开发中(WIP)的合并请求,关于剪切板的支持,但是现在它还没有完成。目前只支持纯文本。
WebAssembly是一种可在网页浏览器中执行的字节码格式,应用程序无需执行独立的安装步骤,就能通过兼容的网页浏览器部署到设备上。应用程序会运行在网页浏览器的安全沙盒中,适合于那些不需要访问完整设备功能、只需便捷简单安装过程的应用。在Qt 5.11中,我们发布了Qt for WebAssembly技术预览版,您可尝试直接在浏览器窗口中运行Qt应用程序。