Qt Everywhere - Dies ist der Name der Archive mit Qt-Quellen. WebAssembly und WebGL-Streaming werden in 5.12.0 bereitgestellt und klingen überall anders. Also gebeten, etwas zu prototypisieren. Ein Chat-Prototyp auf Web-Sockets wurde schnell bereitgestellt, um die Netzwerkunterstützung zu testen. Unter der Katze finden Sie Anweisungen zum Erstellen und Starten eines Projekts in WebAssembly, ein Beispiel für das Aufrufen von JavaScript aus C ++.
Qt-Assembly mit WebAssembly
Zuerst müssen Sie die Toolchain emscripten setzen , die wir Qt sammeln werden. Denken Sie daran, Umgebungsvariablen so festzulegen, dass qmake emcc findet. Das configure
wurde mit den folgenden Parametern ausgeführt:
./configure \ -prefix /home/dmitry/Qt/5.12.0/wasm \ -xplatform wasm-emscripten \ -confirm-license -opensource \ -nomake tests \ -c++std c++1z \ -nomake examples \ -release \ -no-dbus \ -skip qtxmlpatterns \ -skip qttools
Weiter wie anderswo:
$ make $ make install
Montage und Start des Projekts
$ ~/Qt/5.12.0/wasm/bin/qmake $ make $ emrun chat.html
Das Nähen der URL, an der das Backend hängt, ist nicht sehr gut, weil möchte auf einem beliebigen Port laufen. Bei Arbeiten über den Browser müssen Sie location.hostname
und location.port
um festzustellen, wo das Backend ausgeführt wird. Dazu müssen Sie ein wenig in JavaScript schreiben.
Für Liebhaber von Q_OS_WASM
gibt es Q_OS_WASM
, aber ich ziehe es vor, den Code in Pimpl und einzelnen Dateien herauszunehmen. Pimpl ist hier überflüssig, aber ich werde den Code in verschiedene Dateien verteilen
Lassen Sie uns eine Art Konfiguration bekommen
und zwei Implementierungen
Es bleibt in der Pro-Datei zu registrieren
wasm { SOURCES += config_wasm.cpp } else { SOURCES += config.cpp }
EM_ASM_
ist eine EM_ASM_
Magie, mit der Sie JavaScript-Code aus C ++ aufrufen können. Obwohl es ohne JavaScript möglich wäre
emscripten::val location = emscripten::val::global("location"); auto host = QString::fromStdString(location["host"].as<string>()); auto protocol = QString::fromStdString(location["protocol"].as<string>());
Browser-Unterstützung
Desktop-Browser: Es startet und funktioniert in Chrome, Firefox, Safari, Edge (hier musste ich experimentelle JavaScript-Funktionen aktivieren). Abhängig von der Hardware kann es zu erheblichen Verzögerungen beim Kompilieren von WebAssembly kommen.
In Chrome unter Andorid kann das Kompilieren von WebAssembly Minuten dauern. Ich bemerkte sofort die mangelnde Unterstützung für mobile Browser, nämlich, dass beim Versuch, Text einzugeben, die Systemtastatur nicht aufgerufen wird.
Safari unter iOS 12 hier stürzt die Anwendung in der Phase der Kompilierung von WebAssembly ab und ich habe nicht debazhit. Theoretisch können Sie zu asm.js wechseln, dies erfordert jedoch eine separate Studie.
Qt Quick WebGL
Der Blog positionierte sich als VNC auf Web-Sockets mit Rendering auf WebGL. Von den Abhängigkeiten Qt WebSockets und Qt, die mit Unterstützung für OpenGL ES 2 kompiliert wurden, d.h. Das Fahren auf Hardware ohne GPU ist schmerzhaft. Um dies zu unterstützen, -platform webgl
Sie einfach das Qt WebGL Streaming Plugin in das Online-Installationsprogramm ein und führen Sie die Anwendung mit der -platform webgl
oder -platform webgl:port=80
wenn Sie einen Port angeben müssen.
Diese Technologie hat jedoch ihre Grenzen:
- Verzögerungen oder die berüchtigte Eingangsverzögerung;
- mangelnde Anwendungsunterstützung für Qt-Widgets;
- mangelnde Schallübertragung;
- eine Benutzerverbindung pro Prozess, d.h. Wenn Sie die zweite Registerkarte nicht mehr eingeben, dreht sich der Preloader.
Ich bemerkte auch, dass die fps beim Animieren von StackView bei Übergängen zwischen Bildschirmen nachgaben. Vorteil des WebGL-Streamings:
- eingebauter Server;
- minimaler Aufwand. Ich musste Qt nicht aus den Quellen kompilieren und die vorhandene Anwendung separat neu erstellen.
Wird für WebAssembly und WebGL-Streaming verwendet
Eine Alternative, wenn es in C ++ eine vorgefertigte Anwendung gibt und Sie die Weboberfläche daran befestigen müssen. Zum Beispiel die Webschnittstelle zum Torrent-Schaukelstuhl.
Webinterface für ein Smart Home. Nicht umsonst wurde MQTT an Qt geliefert, sondern ein Beispiel für mqtt_simpleclient in msorvig / qt-webassembly-examples . Sie können einen allgemeinen UI-Code verwenden, der auf dem Tablet und im Browser funktioniert.
Der Code ist auf GitHub verfügbar, vorbereitete Binärdateien an derselben Stelle.