多个用户在 Web 浏览器界面上访问的 Qt 应用程序

Qt application accessed by multiple users on a web browser Interface

我有一个应用程序在 Qt 中使用一些 c++ 和 python 集成模块(机器学习、信号处理等)实现,具有以下基本特征:

  1. 可以运行并行(QThread
  2. 的内部多线程模块
  3. 通过 Qt 小部件提供二维图 (not send images) 等可视化特征,例如 QwtPlotZoomerQwtPlotMarkerQGraphicsRectItemQwtPlotCurve

我的目标是通过具有 多个 用户-观察者的 Web 浏览器应用程序提供服务器 运行ning 应用程序已经实现的应用程序特性。我做了一些研究并发现了一些可能的解决方案(Qt WebGL,Qt for Assembly,Wt) on the following links (link, link, link, and link)但是作为一个没有经验的 Web 应用程序开发人员我不完全确定这些或替代和更可取的 C++ 模块采用。

能否根据成熟度、功能、易用性和成熟度(Qt 小部件的灵活性)等特征,提供一些关于 Web 开发库使用的建议和指导,同时也考虑到帐户我的应用程序的特点?

提前致谢。

PS:如果这对我有帮助,我想提一下我在 C++ 和 python 方面的经验,而不是 Java 和 Javascript。

我真的认为只有一件主要事情:如果它开始崩溃,您可能需要以下之一:

https://doc.qt.io/qt-5/qmutex.html

至于网络脚本,我倾向于使用 QWebEnginePage::runJavaScript() 警告说这并不容易。原因是,当从 C++ 注入 javascript 时,您正在处理来自 C++ 的单线程线性环境,这使得代码注入的时间和点变得非常困难。这基本上是一个竞争条件地狱,我最终开发的 serviceable model 只有脚本 运行 直到得到想要的结果。

https://doc.qt.io/qt-5/qwebenginepage.html#runJavaScript

意思是,将任务委派给强大的 javascript 应用程序是很好的做法。

最后,因为你在用Qt工作,养成"Create everything as an API"的心态是很好的。

如果你想制作一个可以使用 Qt 为多个客户端提供服务的应用程序,有 3 个通用选项:

Qt WebGL 平台插件

这个将创建一个纯服务器端实现,并在浏览器中远程显示 GUI。这似乎是最简单的方法,但有一些限制和缺点:

  1. 一次只能服务一个客户端。这可以通过创建一个 "spawner" 应用程序来解决,该应用程序等待传入流量并为每个连接的客户端启动一个新实例。但是,这需要相当多的额外逻辑并且资源很重
  2. 高网络负载。特别是交互式 GUI 可以绘制高达 40MBit/s 每个客户端
  3. 没有客户端逻辑。根本不可能在此设置中添加客户端代码

总而言之,此方法从未设计用于此类用例。它旨在用作无头设备或维护访问的 GUI。我推荐使用它。

服务器应用程序 + WebAssembly 的 Qt

将您的应用程序一分为二:服务器应用程序和客户端应用程序。使用 Qt for WebAssembly 的客户端应用程序。两者之间的通信可以通过 QtWebSocketsQtRemoteObjects 或其他 Network-IPC 解决方案来完成。

这给了你只使用一种语言的优势,并且使得 IPC 非常容易,因为双方都使用 Qt。此外,计算繁重的任务在 WASM 中效率更高。然而,Qt for WebAssembly 仍处于技术预览状态,因此还不稳定。例如,它还不支持多线程或 TCP/IP 套接字。此外,目前并非所有终端设备都支持 WASM。

服务器应用程序 + HTML WebApp

最后一种方法是混合技术。使用像 Cutelyst 这样的网络框架来创建一个基于 Qt 的网络服务器,并用它来服务一个经典的 HTML 网站。您可以使用 QtWebChannel 在 Qt-Server 和 HTML-Client 之间轻松传输数据。


WASM 和 HTML 客户端之间的决定由您决定。使用 WASM 对您来说可能更容易,但也有其自身的挑战。我建议您对两者进行更多研究。然后为这两种解决方案创建一些测试应用程序并进行比较,以确定哪一种最适合您的需求