在Web上运行Qt应用程序

14

我正在使用Qt编写一个应用程序,想尝试将其部署为Web应用程序。 我希望用户能够通过web浏览器访问我的应用程序。 我猜这就是Web应用程序的作用? 我有哪些选择? 我从未尝试过任何类似的事情,但我想学习一些新东西。

编辑:如果我在Linux服务器上部署我的应用程序,并让用户通过终端访问/运行它会怎样?我认为编写Web应用程序比我最初想象的要复杂。


1
Web应用程序和桌面应用程序通常使用非常不同的概念。你不能把一个Qt应用程序放到浏览器中运行。虽然有Google NaCl,但它是有限制的,而且可能也不是你想要的。 - Lukáš Lalinský
7个回答

6
您正在寻找 Wt,它为许多 Qt GUI 元素提供了不同的绘图例程,将它们从屏幕上的线条转换为 HTML 控件。

http://www.webtoolkit.eu/wt

它还处理websocket调用以提供交互性。这似乎是一个好主意,让我们看看它在实践中的表现如何。

6年后,Wt仍然是一个可行的选择吗?我更喜欢使用C++和Python,跳过JS,就像链接网站上所说的那样。 - mLstudent33
1
@mLstudent33,你可能想要使用仍然存在的wxWidgets,但我认为Wt不过是一个有趣的想法,试图将Web技术用于UI。如今,你可以使用JavaScript或WASM编写Web UI,并在API后面编写好的代码。JS很糟糕,但对于UI来说,它很有效,并且有许多像d3这样的优秀库,所以不要太担心。 - gbjbaanb

6
如果您只有Qt应用程序,则最好的选择是使用Qt 5,并使用远程可视化软件运行它:
  1. 使用在Qt 5.10中引入的WebGL流式传输。Qt直接公开可连接浏览器的界面,无需第三方代码。

  2. 对于Qt 5.0-5.9,可以使用VNC平台插件。然后使用基于Web浏览器的VNC客户端进行连接。

对于许多用途来说,这可能已经足够了,肯定比编写Web应用程序要轻松得多。

4

4
对于QML,有一个QmlWeb库,它是一个JavaScript库,能够解析QML代码并使用普通的HTML/DOM元素和CSS中的绝对位置创建网站,将QML属性转换为CSS属性。
QmlWeb是Lauri Paimen的一个小项目,他已经开发了几年了。当然,QmlWeb还不支持Qt实现的QML所支持的所有功能,但它已经支持了相当可用的一部分。它支持几乎所有最基本的QML语法。此外,它还支持HTML输入元素(目前支持Button、TextInput、TextArea等,更多元素即将支持)。
好的,QmlWeb还没有完成。我希望Digia能帮助这个项目,使其具备成熟的功能。

3

尝试使用"Qt for Webassembly"

Webassembly允许将C/C++代码编译并在大多数浏览器中本地运行:

WebAssembly(Wasm,WA)是一个网络标准,定义了一种二进制格式和相应的类似汇编的文本格式,用于Web页面中的可执行代码。...经过验证步骤后,在网络浏览器中的沙箱中执行。程序可以从高级语言编译为Wasm模块,并作为库从JavaScript小应用程序中加载...其最初的目标是支持从C和C ++编译,尽管对其他源语言的支持,如Rust和.NET语言也正在出现。


1
为了使用户能够在浏览器中操作Qt应用程序而无需更改,您可以使用x86Android ABI将其编译为Android,在服务器上运行Android模拟器,并向用户的浏览器提供Android Cast视频流。您还需要在网页客户端上设置JavaScript,以记录键盘和鼠标事件并将其传递回服务器。
我之前尝试过Qt WebGL流媒体,发现它在本地网络上表现良好,但在互联网上速度太慢。10秒的应用程序启动时间是可接受的,但3秒的屏幕显示时间则不太理想。我对Qt VNC平台插件也有完全相同的体验。与此相比,基于Android Cast流媒体的appetize.io解决方案(见下文)要快得多,即使在我的8 Mbit/s连接下也提供了可用的用户体验。
现有的解决方案:
以下是我发现的商业产品和开源软件组件的概述,它们可以帮助您采用这种方法:
  • appetize.io 这是一款商业产品,用于在网络上运行 Android 应用程序进行演示和测试。我刚刚使用了一个基于 Qt QML 的应用程序,并喜欢它的效果。选择 Android 9/10 设备时,您可以看到“屏幕转播”设置已开启;这就是我认为此解决方案使用 Android Cast 技术的原因。

  • runthatapp.com 这是另一个商业服务提供商。虽然不像 appetize.io 那样复杂(但),但提供了一个不错的按需付费计划。

  • ScreenStream 这是一个开源的 Android 应用程序,提供一个 Web 服务器来在 Web 浏览器中查看一个 Android 设备的屏幕,并依赖于 Android Cast 技术。该 Android 设备可以是在 Web 服务器上运行的模拟器。为了使其支持多用户,您可以采用类似于我为 Qt WebGL 流媒体开发的一种技术的小型负载均衡器。ScreenStream 的 README 显示,该应用程序可能会在短时间内每个客户端消耗高达 20 Mbit/s。

未来改进的想法

将您的Qt应用程序作为交互式实时视频流提供似乎是一个很有前途的想法,因为我发现它比VNC和类似的解决方案更少延迟。有方法可以使这个过程更快,例如使用硬件H.265视频编码器创建具有非常少延迟的视频流。通过在单个服务器上操作多个这样的编码器,服务器可以为多个客户提供服务,并仍然保持其CPU负载低。也许还有更好的视频格式可用于此类目的,因为程序的用户界面很容易进行无损压缩。

关于appetize.io的一些提示

最后:由于我在过去几天中使用了appetize.io产品来运行Qt应用程序,因此以下是我的一些经验技巧:

需要为您的Qt应用程序编译 x86 Android ABI。默认的 armeabi-v7a ABI 将不起作用,因为大多数 appetize.io 设备实际上是基于服务器的 Android 模拟器,而唯一的基于 ARM 的设备(“Nexus 5 Physical”)无法启动我尝试使用它的任何 Qt 应用程序。
所有 appetize.io 链接(独立页面和可嵌入 iframes)都支持 GET 参数配置应用程序展示格式。特别相关的是 screenOnly=true,以显示没有手机或平板电脑图片的应用程序。
依赖于手机硬件(相机、位置等)的功能将无法工作或仅显示虚拟数据。但如果您真的想要,您可以创建一个混合应用程序,结合客户端 JavaScript。它将在用户的浏览器中运行依赖于设备的代码,例如使用网络摄像头拍照,并通过appetize.io 跨文档消息协议将结果提供给 Qt 应用程序。以下消息类型似乎适合构建简单的通信协议:pasteText(value)keypress(key, shiftKey)openUrl(value)
在默认的 appetize.io 独立应用程序演示页面中,只发送普通字母键的关键事件到应用程序,而不是键盘快捷键或功能键,如 F2Esc。这可能可以通过在自己的页面上使用 JavaScript 嵌入 appetize.io iframe 来修复,因为它们的 跨文档消息协议 提供了 keypress(key, shiftKey) 消息类型。

0

Qt 不支持编写基于浏览器的 Web 应用程序,遗憾。

您需要使用常见的 Web 编程技术来实现此功能。有很多方法,但 Qt 不是其中之一。


1
Qt5有一个wasm版本,可以在浏览器上运行。 - StereoMatching

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接