Join us at Qt C++ Warsaw Meetup - 21.08.2025

Sign up for free!

Wie man Qt WebAssembly verwendet – Der vollständige Leitfaden mit Demo.

Qt QML-Entwicklung
2025-07-10
9 Minuten
Wie man Qt WebAssembly verwendet – Der vollständige Leitfaden mit Demo.

Hey, willkommen zurück zu einem weiteren Blogbeitrag. Heute sprechen wir über das neue Qt WebAssembly. Dieser Beitrag hilft dir, die Grundlagen zu verstehen, liefert praktische Informationen und Beispiele, damit du schnell loslegen kannst. Wir erklären, worum es geht, warum du es nutzen solltest und erstellen anschließend gemeinsam einige coole Demos.

Als ein Team mit jahrelanger Erfahrung in der Qt-Entwicklung – von plattformübergreifenden Desktop-Apps bis hin zu eingebetteten Systemen – suchen wir ständig nach neuen Wegen, die Technologie weiter voranzutreiben. Wenn du Qt WebAssembly für dein nächstes Projekt in Betracht ziehst und Unterstützung, Beratung oder einen Entwicklungspartner brauchst, zögere nicht, kontaktiere uns.

Genug geplaudert, los geht’s!

 

Warum es dich interessieren sollte

Als Qt-Entwickler hatte ich immer das Gefühl, dass ich mit diesem Technologie-Stack Projekte für nahezu alle Zielplattformen umsetzen kann – von Bare-Metal-Hardware und Mikrocontrollern bis hin zu vollständigen Desktop- und mobilen Anwendungen. Ich könnte sogar ein Computerspiel erstellen 😎

Es gab einen Bereich, von dem ich immer dachte, ich hätte ihn bereits abgedeckt – Webanwendungen. Bis vor Kurzem war ich der Meinung, dass die einzige Option HTML+CSS+JS + [dein bevorzugtes JS-Framework hier einfügen] sei.

Zum Glück lag ich falsch und ich habe mir angesehen, wie Qt WebAssembly funktioniert – und oh Junge, jetzt herrsche ich über sie alle! Es hat einige Versuche und Irrtümer gebraucht, um hierher zu kommen – und ich werde dir auch zeigen, wo du leicht Fehler machen könntest, wenn du gerade erst anfängst. Wir erklären, worauf du achten solltest, damit du meine Fehler nicht wiederholst.

 

Webassembly-Meme
 

Bevor ich beginne, die Vorteile dieses Ansatzes zu erklären, lass mich erst einmal erklären, was WebAssembly überhaupt ist.

 

Was ist WebAssembly grundsätzlich?

Bevor wir tiefer einsteigen, solltest du wissen, was WebAssembly eigentlich ist – dieses Verständnis wird dir helfen, später die richtigen technischen Entscheidungen zu treffen.

WebAssembly (Wasm) ist ein binäres, niedrigstufiges Anweisungsformat, das entwickelt wurde, um Code mit nahezu nativer Leistung in Webbrowsern auszuführen. Es wurde entwickelt, um eine der Hauptbeschränkungen herkömmlicher Webtechnologien zu überwinden: die Schwierigkeit, komplexe, rechenintensive Anwendungen effizient im Browserumfeld auszuführen.

Anders als JavaScript, das interpretiert und dynamisch typisiert ist, wird WebAssembly aus Sprachen wie C, C++ oder Rust in ein binäres Format kompiliert, das vom Browser schnell geladen und ausgeführt werden kann.

 

Alles an einem Ort – *.wasm-Datei

Im Zentrum jeder WebAssembly-Anwendung steht die .wasm-Datei. Diese Datei enthält den tatsächlichen Code, den der Browser ausführen wird. Im Gegensatz zu JavaScript oder HTML ist sie nicht menschenlesbar, sondern ein binäres Format – kompakt, effizient und für schnelle Ausführung ausgelegt.

Du kannst dir eine .wasm-Datei als die kompilierte Version deines Programms vorstellen – ähnlich wie C++-Code in eine .exe oder .out-Datei für native Plattformen kompiliert wird. Der Unterschied besteht darin, dass .wasm für die Ausführung innerhalb der WebAssembly-Laufzeitumgebung des Browsers entwickelt wurde, die in allen modernen Browsern integriert ist.

Die .wasm-Datei selbst wird während des Build-Prozesses mit der Emscripten-Toolchain erzeugt. Emscripten kompiliert C- oder C++-Quellcode in eine Zwischenrepräsentation und übersetzt diese anschließend in das WebAssembly-Binärformat.

 

Wie die .wasm-Datei erzeugt wird
 

Warum du WebAssembly verwenden solltest

  • Nahezu native Leistung – Da in Binärformat kompiliert, wird WebAssembly deutlich schneller als JavaScript ausgeführt und eignet sich ideal für anspruchsvolle Aufgaben wie Grafik, Simulationen oder Datenverarbeitung.
  •  

  • Portabilität – Ein großer Vorteil von WebAssembly ist seine Portabilität. Dieselbe .wasm-Datei kann in allen modernen Browsern ausgeführt werden, unabhängig vom zugrunde liegenden Betriebssystem oder der Hardware.
  •  

  • Sicheres Sandbox-Umfeld – WebAssembly läuft in einer Sandbox des Browsers ohne direkten Systemzugriff, was die Sicherheit erhöht und potenzielle Risiken isoliert.
  •  

  • Funktioniert mit JavaScript – WebAssembly-Module können von JavaScript aus aufgerufen werden (und umgekehrt), was hybride Apps ermöglicht, bei denen nur leistungsintensive Teile Wasm nutzen.
  •  

  • Code-Wiederverwendung – Bestehende C/C++-Bibliotheken können zu .wasm kompiliert werden, was die Wiederverwendung bewährten nativen Codes ohne Neuschreiben für das Web ermöglicht.

 

Einschränkungen und Nachteile von WebAssembly

So leistungsfähig WebAssembly auch ist, es gibt einige Einschränkungen. Bevor du es für produktive Anwendungen einsetzt, solltest du Folgendes beachten:

 

  • Begrenzte Browser-Integration – Im Gegensatz zu JavaScript hat WebAssembly keinen direkten Zugriff auf den DOM oder Browser-APIs. Man muss häufig Funktionen über JavaScript überbrücken, was zusätzliche Komplexität mit sich bringt.
  •  

  • Größere Anfangsgröße – WebAssembly-Module sind in der Regel größer als JavaScript-Bundles. Obwohl sie schneller ausgeführt werden, kann die Initialisierungszeit insbesondere bei langsamen Verbindungen länger sein.
  •  

  • Fehlersuche kann schwieriger sein – Das Debuggen von .wasm-Dateien ist nicht so einfach wie bei JS oder TypeScript. Zwar gibt es Quellzuordnungen, aber die Tools befinden sich noch in der Entwicklung.
  •  

  • Einzelthreading, wenn nicht richtig konfiguriert – Ohne geeignete Einstellungen (z. B. Cross-Origin-Isolation) funktioniert Multithreading nicht. Einige Hosting-Plattformen unterstützen die erforderlichen Header standardmäßig nicht.
  •  

  • Nicht für jeden Anwendungsfall geeignet – Wenn deine App hauptsächlich UI-gesteuert ist und keine native Leistung benötigt, ist ein modernes JS-Framework möglicherweise die einfachere und effizientere Wahl.
  •  

  • Sicherheitsrisiken bei schlecht konfigurierten Sandboxes – Obwohl WASM in einer Sandbox läuft, können falsch konfigurierte Apps oder Bibliotheken dennoch Angriffsflächen bieten, insbesondere wenn du große native Codebasen kompilierst.

Erste Schritte mit Qt für WebAssembly

Nachdem wir die Theorie behandelt haben, kommen wir nun zu etwas Interessanterem. Zuerst bereiten wir jedoch unsere Umgebung und die nötigen Voraussetzungen vor.

Voraussetzungen & Einrichtung der Umgebung

Um Qt für WebAssembly zu verwenden, benötigst du:

 

  • Qt mit WebAssembly-Unterstützung – vorzugsweise Qt 6+
  • Emscripten SDK (emsdk) – eine Compiler-Toolchain, die C- und C++-Code in WebAssembly übersetzt.
  • Python 3 – wird später für das Ausführen eines einfachen lokalen Webservers verwendet
  • Einen modernen Webbrowser – Chrome, Firefox, Safari oder Edge – alle aktuellen Versionen unterstützen WebAssembly.

Der gesamte Einrichtungsprozess ist in diesem Artikel der offiziellen Dokumentation gut beschrieben, daher werde ich ihn nicht wiederholen und wir machen direkt weiter.

Eine Beispielanwendung mit Qt WebAssembly erstellen

Da unsere Umgebung nun vorbereitet ist, probieren wir WebAssembly in der Praxis aus.

 

Qt WebAssembly-Demo: Brain Viewer in Aktion

Anstatt eine Anwendung von Grund auf neu zu schreiben, öffne ein Projekt, das du bereits zuvor erstellt hast. Ich öffne eine unserer Demos – Brain Viewer. Wenn du damit nicht vertraut bist, empfehle ich dir die Fallstudie dazu. Kurz gesagt: Es ist eine App, die ich entwickelt habe, um ein 3D-Modell des menschlichen Gehirns anzuzeigen.

Mal sehen, wie WebAssembly mit dieser Herausforderung klarkommt!

 

Hey, das bin ich und mein Gehirn!
 

Kompilieren & Bereitstellen

Okay, als Erstes öffnest du Qt Creator und dein Projekt. Sobald deine App bereit ist, kannst du sie direkt aus Qt Creator für WebAssembly bauen – vorausgesetzt, das Qt für WebAssembly-Kit ist korrekt installiert und konfiguriert. Qt Creator vereinfacht den Prozess, indem es die Toolchain und Build-Schritte im Hintergrund übernimmt, sodass du dich auf die Entwicklung konzentrieren kannst.

 

  1. Wähle im Projekte-Panel das WebAssembly-Kit (z. B. Qt 6.x WebAssembly).
  2. Wähle die gewünschte Build-Konfiguration (typischerweise Release)
  3. Klicke auf Build oder drücke Strg+B, um den Build-Prozess zu starten.
  4. Beobachte, wie alles funktioniert!
  5.  Schau, es läuft im Browser!

Nach einem erfolgreichen Build erzeugt Qt Creator eine Reihe von Dateien im Build-Verzeichnis:

 

  • .wasm – die kompilierte WebAssembly-Binärdatei,
  • .js – JavaScript-Lade-Skript für die Laufzeit,
  • .html – eine einfache HTML-Seite zum Starten der App,
  • .data – Anwendungsressourcen (falls vorhanden).

Diese Dateien können auf jedem HTTP-/HTTPS-Server bereitgestellt und über einen modernen Browser aufgerufen werden. Standardmäßig führt Qt Creator den lokalen Server auf Port 30000 aus.

Häufige Fehler, die vermieden werden sollten

Ein häufiger Fehler ist der Versuch, ohne korrekt konfiguriertes WebAssembly-Kit oder ohne Emscripten im PATH zu kompilieren. Stelle sicher, dass alle Werkzeuge installiert und auf dem neuesten Stand sind. Wenn deine App nicht lädt, überprüfe die Browser-Konsole auf fehlende Dateien oder CORS-Fehler.

 

Einzel- vs. Mehrthread-Kits

Beim Auswählen eines WebAssembly-Kits in Qt Creator kannst du Optionen für Single-Threaded und Multi-Threaded Builds sehen. Diese Auswahl beeinflusst, wie die Anwendung kompiliert wird und sich zur Laufzeit verhält.

 


 

  • Single-Threaded: Dies ist der kompatibelste Modus. Die Anwendung läuft vollständig im Haupt-Thread des Browsers und benötigt keine WebAssembly-Threads oder Shared Memory. Funktioniert in allen modernen Browsern, auch in Umgebungen mit strikteren Sicherheitsrichtlinien (z. B. ohne Unterstützung von SharedArrayBuffer). Allerdings ist die Parallelverarbeitung eingeschränkt – Features wie QThread oder Hintergrundverarbeitung stehen nicht zur Verfügung.
  •  

  • Multi-Threaded: Dieser Build aktiviert Threading-Unterstützung in WebAssembly und erlaubt der Anwendung, Funktionen wie QThread oder paralleles Rendering zu nutzen. Er setzt SharedArrayBuffer voraus, was wiederum Cross-Origin Isolation und spezielle HTTP-Header (COOP und COEP) erfordert. Leistungsfähiger, aber benötigt zusätzliche Konfiguration auf dem Server und wird nicht in jeder Hosting-Umgebung unterstützt.

Verwende Single-Threaded für maximale Kompatibilität und einfache Bereitstellung, und Multi-Threaded, wenn deine App auf Parallelverarbeitung angewiesen ist und du die Hosting-Umgebung kontrollieren kannst.

 

Integration deines WASM-Builds in eine Web-App

In einfachen Fällen kann die generierte HTML-Datei direkt über einen lokalen Server geöffnet werden. In der Produktion werden diese Dateien jedoch häufig in eine größere Webanwendung oder benutzerdefinierte Benutzeroberfläche eingebettet.

Typische Integrationsschritte:

 

  • Platziere die generierten Dateien im öffentlichen Verzeichnis deiner Webanwendung,
  • Lade das JavaScript-Lade-Skript (.js), das die .wasm-Datei initialisiert und ausführt,
  • Bette die Anwendung in ein benutzerdefiniertes <canvas>- oder <iframe>-Element deiner Seite ein.

Qt WebAssembly-Anwendungen werden in ein HTML-<canvas> gerendert, das automatisch vom Laufzeit-Skript verwaltet wird. Die generierte .html-Datei ist ein einfacher Wrapper, den du direkt verwenden oder durch deine eigene Seite ersetzen kannst – achte nur darauf, dass das JS-Lade-Skript eingebunden ist und ein Canvas-Element vorhanden ist, in das die App gerendert werden kann.

 

Wie du sehen kannst, das generierte HTML
 

Hinweis: Auch wenn das automatisch generierte HTML nützlich ist, integrieren viele Nutzer das WebAssembly-Modul in eine bestehende Webanwendung, um mehr Kontrolle zu haben. Dokumentiere jeden Integrationsschritt, damit andere aus deiner Erfahrung lernen können.

 

Ausführen eines einfachen Servers

Für Demonstrationszwecke nehmen wir an, wir haben eine einfache Website und wollen unsere Demo darin einbetten. Ich habe ein minimales Beispiel für einen Python-HTTP-Server geschrieben, der Cross-Origin Isolation unterstützt – erforderlich für Multithreaded WebAssembly:

 

from http.server import SimpleHTTPRequestHandler, HTTPServer

class CustomHandler(SimpleHTTPRequestHandler):
    def end_headers(self):
        # Fügt notwendige Header für Multithreading in WebAssembly hinzu
        self.send_header("Cross-Origin-Opener-Policy", "same-origin")
        self.send_header("Cross-Origin-Embedder-Policy", "require-corp")
        super().end_headers()

    def do_GET(self):
        # Liefert eine bestimmte HTML-Datei als Standard-Einstiegspunkt aus
        if self.path == '/':
            self.path = '/appBrainViewer.html'
        return super().do_GET()

PORT = 8080

with HTTPServer(("", PORT), CustomHandler) as httpd:
    print(f"Serving at http://0.0.0.0:{PORT}")
    httpd.serve_forever()

Dieser lokale Server verarbeitet alle eingehenden HTTP-Anfragen und liefert deine WebAssembly-Dateien mit den richtigen Headern aus. Das ist eine großartige Möglichkeit für Nutzer, ihren Build lokal zu testen, ohne ihn in die Produktion hochzuladen.

Was das Skript macht:

 

  • Dient Dateien über HTTP auf Port 8080
  • Erzwingt im Browser einen isolierten Kontext (erforderlich für WebAssembly-Threads)
  • Leitet / auf eine bestimmte HTML-Datei weiter (z. B. den Haupteinstiegspunkt deiner App)

Mit diesem Skript kannst du deine App lokal mit allen aktivierten WASM-Funktionen testen – inklusive Multithreading, sofern zutreffend.

 

Zusammenfassung

Das war’s für den heutigen Artikel. Wenn du neugierig bist, auf welchen (vielleicht noch nicht existierenden) Plattformen man Qt-Anwendungen zukünftig ausführen kann, dann bleib dran – bis zum nächsten Mal!

Wir hoffen, dieser Artikel hat dir geholfen, die Informationen zu finden, die du gesucht hast. Wenn du auch der Meinung bist, dass Qt WebAssembly spannende neue Möglichkeiten eröffnet, probiere unsere Demo aus oder fordere eine Beratung durch unser Team an.

Scythe-Studio - Head of Operations

Jakub Wincenciak Head of Operations

Brauchen Sie Qt QML-Entwicklungsdienste?

service partner

Kommen wir zur Sache: Es ist eine Herausforderung, Top-Qt-QML-Entwickler zu finden. Helfen Sie sich selbst und starten Sie die Zusammenarbeit mit Scythe Studio – echten Experten im Qt C++ Framework.

Entdecken Sie unsere Fähigkeiten!

Neueste Artikel

[ 156 ]