Spec-Zone.ru › Qt 5.15

Заметки к платформе Qt WebAssembly

WebAssembly (или webasm) — это формат байткода, предназначенный для выполнения в виртуальной машине внутри веб-браузера. Это позволяет развернуть приложение на устройстве с совместимым веб-браузером без каких-либо этапов установки. Приложение будет работать внутри защищённой среды в веб-браузере. Это подходит для приложений, которым не нужен полный доступ к возможностям устройства, но которые выигрывают от быстрого и простого процесса установки.

Поддерживаемые целевые браузеры и устройства

Рабочий стол

  • Chrome
  • FireFox
  • Safari
  • Edge(Chrome)

Если браузер поддерживает WebAssembly, то Qt должен работать.

Примечание: Qt имеет фиксированное требование к WebGL, также для приложений, которые не используют WebGL напрямую. Браузеры часто помещают WebGL в чёрный список для устаревших/неподдерживаемых графических процессоров.

Мобильные устройства

  • Браузер Android
  • Mobile Safari

Примечание: В настоящее время нет поддержки ввода текста с помощью виртуальной клавиатуры. Safari в настоящее время не поддерживает wasm-модули размера, который производит Qt.

Qt не использует непосредственно функции операционной системы, и не имеет значения, например, работает ли FireFox на Windows или macOS. Qt использует некоторые адаптации операционной системы, например, для обработки клавиш ctrl/cmd на macOS.

Поддерживаемые модули Qt

Qt для WebAssembly поддерживает подмножество модулей Qt. Ниже приведён список текущих протестированных модулей. Список можно вставить в качестве аргументов к make.

module-qtbase module-qtdeclarative module-qtquickcontrols2 module-qtwebsockets module-qtsvg module-qtcharts module-qtmqtt

Другие модули не протестированы и могут работать. Не поддерживаются: QtMultimedia и QtWebView

Известные проблемы

Обратитесь к вики.

Известные ограничения

  • Отладка: вывод Qt для отладки и логирования печатается в консоли JavaScript, к которой можно получить доступ через «Инструменты разработчика» браузера или аналогичное средство.
  • Вложенные циклы событий не поддерживаются. Приложения не должны вызывать, например, QDialog::exec() или создавать новый объект QEventLoop.
  • Qt отрисовывает содержимое приложения в элемент холста и не использует (другие) собственные элементы DOM. Это означает, что поддержка доступности (читатели экрана) не поддерживается, и ввод текста не будет активировать виртуальные клавиатуры.
  • Требуется WebGL, даже для приложений, которые сами по себе не используют OpenGL. Большинство современных браузеров поддерживают WebGL, но обратите внимание, что некоторые браузеры помещают в чёрный список определённые устаревшие графические процессоры. Загрузчик Qt обнаружит это и отобразит сообщение об ошибке.
  • Вложенные окна OpenGL не поддерживаются. Композитор окон (в плагине платформы Qt для Wasm) поддерживает только растровые окна.
  • Qt обнаружит поддержку OpenGL как OpenGL ES. На самом деле браузер предоставит WebGL. WebGL основан на ES и очень похож, но существуют некоторые несовместимости. См. Различия между WebGL и OpenGL.
  • Приложения не имеют доступа к системным шрифтам. Файлы шрифтов должны быть распространены вместе с приложением, например, в ресурсах Qt. Сам Qt для WebAssembly встраивает один такой шрифт.
  • Высокое разрешение и масштабирование: поддерживается рендеринг с высоким разрешением, а также установка общего размера отображения пользовательского интерфейса с помощью функции масштабирования браузера. Настройки размера (и типа) шрифта браузера не влияют на приложения Qt.
  • В некоторых компонентах Qt Quick Controls 2, таких как флажки, могут быть артефакты неинициализированной графической памяти.
  • Доступ к сети: веб-песочница ограничивает доступ к сети подмножеством того, что доступно для нативных приложений.
    • QNetworkAccessManager http-запросы к веб-страничному серверу происхождения или к серверу, который поддерживает CORS.
    • QWebScoket подключения к любому хосту.
    • Туннелирование TCP и UDP-сокет через WebSocket с использованием сервера websockify [реализовано Emscripten, не протестировано].
      • Websockify v0.8.0 можно использовать для туннелирования TCP-соединений с QT5.12, но ОБЯЗАТЕЛЬНО указать подпротоколы base64 или двоичные перед вызовом QWebSocket::open().
      • Например:

        QWebSocket socket;

        QUrl url{QString("ws://server:port")};

        QNetworkRequest request{url};

        request.setRawHeader("Sec-WebSocket-Protocol", "binary");

        socket.open(request);

  • Ожидаются предупреждения времени компоновки типа: «нельзя представить значение NaN «0x7fdae4bde910» с пользовательским битовым шаблоном».
  • Ожидаемый размер (размер загрузки): Wasm-модули, создаваемые компилятором, могут быть большими, но сжимаются хорошо.
Пример gzip brotli
helloglwindow (QtCore + QtGui) 2.8M 2.1M
wiggly widget (QtCore + QtGui + QtWidgets) 4.3M 3.2M
SensorTag (QtCore + QtGui + QtWidgets + QtQuick + QtCharts) 8.6M 6.3M

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

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.15/qtwebassembly-platform-notes.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API