Заметки к платформе Qt WebAssembly
Поддерживаемые целевые браузеры и устройства
Рабочий стол
- 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 встраивает один такой шрифт.
- Высокая DPI и масштабирование: Поддерживается отображение высокой DPI, а также установка общего визуального размера пользовательского интерфейса с помощью функции масштабирования браузера. Настройки размера шрифта (и типа) браузера не влияют на приложения Qt.
- Возможны артефакты неинициализированной графической памяти на некоторых компонентах Qt Quick Controls 2, таких как флажки.
- Доступ к сети: веб-песочница ограничивает доступ к сети подмножеством того, что доступно для нативных приложений.
- QNetworkAccessManager запросы HTTP к серверу происхождения веб-страницы или к серверу, который поддерживает CORS.
- Подключения QWebScoket к любому хосту.
- Тунелирование TCP и UDP-сокеттов с использованием WebSockets с использованием сервера 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.8М | 2.1М |
| wiggly widget (QtCore + QtGui + QtWidgets) | 4.3М | 3.2М |
| SensorTag (QtCore + QtGui + QtWidgets + QtQuick + QtCharts) | 8.6М | 6.3М |
Сжатие, как правило, выполняется на стороне веб-сервера с использованием стандартных функций сжатия: сервер автоматически сжимает или выбирает предварительно сжатые версии файлов. Обычно нет необходимости в специальной обработке wasm-файлов.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.13/qtwebassembly-platform-notes.html