通过网络运行Qt应用程序

时间:2014-07-01 19:33:27

标签: c++ linux qt web-applications

我正在使用Qt编写应用程序,并希望尝试将其部署为Web应用程序。我希望用户能够通过Web浏览器访问我的应用程序。我猜这是一个网络应用程序是什么?我有什么样的选择?我从来没有考虑做过这样的事情,但我想学习新的东西。

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

7 个答案:

答案 0 :(得分:3)

你正在寻找Wt,它为许多Qt gui元素绘制例程提供了不同的集合,将它们从屏幕上的行转换为HTML控件。

http://www.webtoolkit.eu/wt

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

答案 1 :(得分:3)

对于QML的情况,QmlWeb是一个JavaScript库,它能够解析QML代码并使用普通的HTML / DOM元素和CSS中的绝对位置创建一个网站,翻译QML属性到CSS属性。

QmlWeb是Lauri Paimen的一个小项目,他已经开发了几年了。 QmlWeb当然还不支持Qt的QML实现,但它已经支持了一个非常有用的子集。它支持几乎所有最基本的QML语法。此外,它支持HTML输入元素(目前支持Button,TextInput,TextArea,更多内容)。

好吧,QmlWeb尚未完成。我希望Digia能够帮助完成这个项目,以便为成熟的功能做好准备。

答案 2 :(得分:2)

如果您拥有的只是一个Qt应用程序,那么您可以做的最好就是使用Qt 5并使用远程可视化包运行它:

    在Qt 5.10中介绍的
  1. Use WebGL streaming。 Qt直接暴露浏览器可连接的界面,无需第三方代码。

  2. 对于Qt 5.0-5.9,您可以使用vnc平台插件。然后使用a web-browser based vnc client连接。

  3. 对于许多用途来说,它可能已经足够了,当然它比编写网络应用程序要少得多。

答案 3 :(得分:2)

有趣的是,可以使用emscripten-qt将Qt应用程序编译为javascript。使用Firefox的asm.js解释器,这些运行速度相当快:

http://vps2.etotheipiplusone.com:30176/redmine/projects/emscripten-qt/wiki

答案 4 :(得分:1)

Qt不支持编写基于浏览器的Web应用程序。不幸的是

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

答案 5 :(得分:0)

尝试"Qt for Webassembly"

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

  

WebAssembly(华盛顿州瓦斯姆)是一个Web标准,为Web页中的可执行代码定义了二进制格式和相应的类似于汇编的文本格式。 ...在验证步骤之后,将在Web浏览器的沙箱中执行它。可以将程序从高级语言编译成Wasm模块,并作为库从JavaScript小程序中加载。它的最初目标是支持从C和C ++进行编译,尽管也支持其他源语言,例如Rust和.NET语言。新兴。

答案 6 :(得分:0)

要在Web上不变地运行Qt应用程序,以便用户可以在浏览器中对其进行操作,可以使用x86 Android ABI在Android上进行编译,在服务器上的Android模拟器中运行, 向用户的浏览器提供Android Cast视频流。您还需要使用JavaScript来记录Web客户端上的键盘和鼠标事件,并将它们中继回服务器。

我以前有tried Qt WebGL streaming,发现它在本地网络上很好,但是在Internet上太慢了。 10 s的应用程序启动时间是可以接受的,但是3 s的时间来显示一个新的屏幕则不是。我对Qt VNC平台插件有完全相同的经验。相比之下,基于Android Cast流的appetize.io解决方案(见下文)要快得多,即使在我的8 Mbit / s连接上也能提供良好的用户体验。

现有解决方案

以下是我发现可以帮助您采用这种方法的商业产品和开源软件组件的概述:

  • appetize.io。这是一种商业产品,可通过Web运行Android应用程序以进行演示和测试。我刚刚使用基于Qt QML的应用程序完成了此操作,并且喜欢结果。选择Android 9/10设备时,您会看到“截屏”设置已启用;这就是为什么我认为此解决方案使用Android Cast技术的原因。

  • runthatapp.com。这是另一种商业报价。还不如appetize.io复杂(但),但是提供了一个不错的按需付费方案。

  • ScreenStream。这是一个开源Android应用程序,提供了一个Web服务器,可以在Web浏览器中查看一个Android设备的屏幕,同时也依赖于Android Cast技术。该Android设备可能是在网络服务器上运行的模拟器。为了使这种多用户功能成为可能,您可以使用类似于我为Qt WebGL流开发的a technique的小型负载均衡器。 ScreenStream自述文件显示,该应用程序在短时间内可能每个客户端消耗高达20 Mbit / s的速度。

未来改进的想法

将Qt应用程序作为交互式实时视频流提供服务对我来说是一个很有前途的主意,因为我发现它已经不如VNC和类似解决方案那么慢。有多种方法可以使此过程更快,例如使用硬件H.265视频编码器以极少的延迟创建视频流。通过在单个服务器上运行多个此类编码器,该服务器可以为多个客户端提供服务,并且仍保持较低的CPU负载。鉴于程序的用户界面很适合无损压缩,因此也许有更好的视频格式可以实现这一目的。

一些关于appetize.io的提示

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

  • 有必要为x86 Android ABI编译Qt应用程序。默认的armeabi-v7a ABI无法正常工作,因为大多数appetize.io设备实际上都是基于服务器的Android模拟器,并且仅有的基于ARM的设备(“ Nexus 5 Physical”)无法启动我尝试使用的任何Qt应用程序。

    x86_64 ABI也可以工作,但是您可能还必须自己编译Qt,因为并非所有Qt版本都已针对该体系结构进行了预编译。

  • 所有appetize.io链接(用于独立页面和可嵌入iframe)均支持GET parameters to configure the app presentation formatscreenOnly=true在这里特别相关,可以显示没有手机或平板电脑图片的应用。

  • 依赖电话硬件(摄像头,位置等)的功能将不起作用或仅显示伪数据。但是,如果您确实需要,可以创建结合了客户端JavaScript的混合应用程序。它将在用户的浏览器中运行与设备有关的代码,例如,使用网络摄像头拍照,然后将结果通过appetize.io cross-document messaging protocol提供给Qt应用程序。以下消息类型似乎适合构建简单的通信协议:pasteText(value)keypress(key, shiftKey)openUrl(value)

  • 在默认的appetize.io独立应用程序演示页面中,仅将普通字母键的键事件发送到应用程序,而不发送键盘快捷键或功能键(如 F2 Esc 。可以通过JavaScript在嵌入appetize.io iframe的自己页面上进行修复,因为它们的cross-document messaging protocol提供了keypress(key, shiftKey)消息类型。