Приложение Qt, доступное нескольким пользователям в интерфейсе веб-браузера

У меня есть приложение, реализованное в Qt с некоторыми интегрированными модулями С++ и Python (машинное обучение, обработка сигналов и т. д.) со следующими основными характеристиками:

  1. Внутренние многопоточные модули, которые могут работать параллельно (QThread)
  2. Предоставлять характеристики визуализации, такие как 2D-графики (не отправлять изображения) через виджеты Qt, например, QwtPlotZoomer, QwtPlotMarker, QGraphicsRectItem, QwtPlotCurve.

Моя цель — предоставить уже реализованные характеристики приложения, работающего на сервере, через приложение веб-браузера с несколькими пользователями-наблюдателями. Я провел небольшое исследование и обнаружил несколько возможных решений (Qt WebGL, Qt for Assembly, Wt) на следующие ссылки (ссылка, ссылка, ссылка и ссылка), но как неопытный разработчик веб-приложений я не совсем уверен, какой из этих или альтернативных и предпочтительных C++ модулей использовать.

Не могли бы вы предоставить некоторые предложения и рекомендации по использованию библиотеки веб-разработки на основе таких характеристик, как зрелость, возможности, простота использования и зрелость (гибкость с виджетами Qt), а также принять во внимание характеристики моего приложения?

Заранее спасибо.

PS: я хотел бы упомянуть, если это поможет, что я разбираюсь в C ++ и python, а не в Java и Javascript.


person Darkmoor    schedule 10.02.2019    source источник
comment
Это также зависит от того, как вы хотите обрабатывать свою логику. Должен ли весь код выполняться на сервере, а клиенты только Видеть результат? (В основном удаленное окно) Или может/должен ли код быть хотя бы частично выполнен в браузерах. Скажи мне это, и я дам тебе ответ   -  person Felix    schedule 11.02.2019
comment
@Феликс, спасибо за интерес. По сути, операции, которые я хочу выполнить, представляют собой алгоритмы машинного обучения, поэтому, насколько я могу представить, сервер должен выполнять тяжелые процессы. В этом пункте я не знаю, должны ли какие-то менее важные и менее тяжелые модули выполняться в браузере. Таким образом, приложение будет транслировать результаты машинного обучения в удаленный браузер, и они будут отображаться (причудливые графики, диаграммы, текст).   -  person Darkmoor    schedule 11.02.2019


Ответы (2)


Если вы хотите создать приложение, которое может обслуживать несколько клиентов с помощью Qt, есть 3 основных варианта:

Плагин платформы Qt WebGL

Это создаст чистую серверную реализацию и просто удаленно отобразит графический интерфейс в браузере. Это кажется самым простым подходом, но он имеет несколько ограничений и недостатков:

  1. Одновременно может обслуживаться только один клиент. Это можно обойти, создав приложение-«спаунер», которое ожидает входящий трафик и запускает новый экземпляр для каждого подключенного клиента. Однако это требует дополнительной логики и больших ресурсов.
  2. Высокая нагрузка на сеть. Особенно интерактивные графические интерфейсы могут потреблять до 40 Мбит/с на клиента!
  3. Нет клиентской логики. Просто невозможно добавить клиентский код в эту настройку.

В целом этот метод никогда не был разработан для такого варианта использования. Он предназначен для использования в качестве графического интерфейса для безголовых устройств или доступа для обслуживания. Я бы не рекомендовал его использовать.

Серверное приложение + Qt для WebAssembly

Разделите ваше приложение на две части: серверное приложение и клиентское приложение. Клиентское приложение с Qt для WebAssembly. Связь между ними может осуществляться с помощью QtWebSockets, QtRemoteObjects или других решений Network-IPC.

Это дает вам преимущество использования только одного языка и делает IPC очень простым, так как обе стороны используют Qt. Кроме того, в WASM намного эффективнее выполнять сложные вычислительные задачи. Однако Qt для WebAssembly все еще находится в состоянии технического предварительного просмотра и, следовательно, еще не стабилен. Например, он еще не поддерживает многопоточность или сокеты TCP/IP. Кроме того, на данный момент не все конечные устройства поддерживают WASM.

Серверное приложение + HTML WebApp

Последний подход заключается в смешении технологий. Используйте веб-фреймворк, например Cutelyst, чтобы создать веб-сервер на основе Qt и обслуживать с его помощью классический HTML-сайт. . Вы можете использовать QtWebChannel для простой передачи данных между вашим Qt-сервером и HTML-клиентом.


Выбор между WASM и HTML-клиентом остается за вами. Использование WASM может быть проще для вас, но у него есть свои проблемы. Я бы порекомендовал вам провести дополнительное исследование обоих. Затем создайте несколько тестовых приложений для обоих решений и сравните их, чтобы выяснить, какое из них лучше всего соответствует вашим потребностям.

person Felix    schedule 11.02.2019
comment
Спасибо, что ответили. Извините за мое невежество, не могли бы вы подробнее рассказать об этих технологиях о том, сможет ли окончательное приложение (основанное на WASM или HTML) отображать причудливые графики, подобные тем, которые включены в стандартную или расширенные виджеты Qt? - person Darkmoor; 12.02.2019
comment
Любая фронтенд-технология может это сделать. WASM пока не работает с QtWidgets, вы должны использовать QtQuick. Однако существуют модули QtCharts и QtDataVisualisation для построения графиков любого типа. Я никогда не делал ничего подобного в HTML, но для этого тоже есть библиотеки java script/css. - person Felix; 12.02.2019

На самом деле я думаю, что есть только одна главная вещь: если он начинает падать, вам, вероятно, понадобится один из них:

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

Что касается веб-скриптов, я обычно использую QWebEnginePage::runJavaScript() с оговоркой, что это непросто. Причина в том, что при внедрении javascript из C++ вы имеете дело с однопотоковой линейной средой из C++, что очень затрудняет время и точку внедрения кода. По сути, это ад условий гонки, и serviceable model, который я в итоге разработал, просто запускает скрипт до тех пор, пока не получит желаемый результат.

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

Это означает, что хорошо делегировать задачи надежным приложениям javascript.

Наконец, поскольку вы работаете с Qt, полезно разработать образ мышления «Создавайте все как API».

person Anon    schedule 11.02.2019
comment
Это зависит от QWebEngine, браузера в виде виджета, отображаемого внутри обычного настольного приложения Qt. Вопрос скорее об использовании Qt для создания клиент-серверного веб-приложения, которое может использоваться несколькими клиентами через их веб-браузеры. - person tanius; 04.08.2020
comment
@tanius Мой совет для этого — использовать QRemoteObjects. - person Anon; 05.08.2020