【问题标题】:Running a Qt app over the web在 Web 上运行 Qt 应用程序
【发布时间】:2014-08-22 11:12:53
【问题描述】:

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

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

【问题讨论】:

  • Web 应用程序和桌面应用程序通常使用非常不同的概念。您不能使用 Qt 应用程序并使其在浏览器中运行。有 Google NaCl,但它是有限的,而且可能不是你想要的。

标签: c++ linux qt web-applications


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    http://www.webtoolkit.eu/wt

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

    【讨论】:

    • 6 年后,Wt 仍然是一个可行的选择吗?我宁愿坚持使用 C++ 和 Python 并跳过链接网站上所说的 JS。
    • @mLstudent33 那么您可能会想要 wxWidgets,它仍然存在,但我不认为 Wt 不仅仅是一个将网络技术用于 UI 的有趣想法。今天,您不妨使用 javascript 或 wasm 编写 Web UI,并在 API 背后编写好东西。 JS 很烂,但是对于 UI,它可以工作,并且有很多像 d3 这样的好库,所以不要太费劲。
    【解决方案3】:

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

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

    好吧,QmlWeb 还没有完成。我希望 Digia 帮助这个项目,使其具备成熟的功能。

    【讨论】:

      【解决方案4】:

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

      1. Use WebGL streaming,在 Qt 5.10 中引入。 Qt 直接公开了一个可连接浏览器的界面,无需第三方代码。

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

      对于许多用途来说,这可能就足够了,而且肯定比编写 Web 应用程序更省力。

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          试试"Qt for Webassembly"

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

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

          【讨论】:

            【解决方案7】:

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

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

            现有解决方案

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

            • appetize.io. 这是一个商业产品,用于在网络上运行 Android 应用程序,用于演示和测试目的。我刚刚使用基于 Qt QML 的应用程序完成了这项工作,并且很喜欢这个结果。选择 Android 9 / 10 设备时,您可以看到“Screencast”设置已打开;这就是为什么我相信这个解决方案使用了 Android Cast 技术。

            • runthatapp.com. 这是另一个商业报价。不像 appetize.io 那样复杂(还),但提供了一个不错的现收现付方案。

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

            未来改进的想法

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

            appetize.io 的一些提示

            最后:由于过去几天我在 Qt 应用程序中使用了 appetize.io 产品,以下是该经验中的一些提示:

            • 有必要为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 format。这里特别相关的是screenOnly=true,用于显示应用程序周围没有手机或平板电脑的图片。

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

            • 在默认的appetize.io独立应用演示页面中,只有普通字母键的按键事件被发送到应用程序,而不是键盘快捷键或功能键如F2Esc kbd>。这可能可以在嵌入 appetize.io iframe 的自己页面上使用 JavaScript 来解决,因为它们的 cross-document messaging protocol 提供了 keypress(key, shiftKey) 消息类型。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2021-12-07
              • 1970-01-01
              • 2012-08-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多