Kapitel 46. Qt WebEngine

In diesem Kapitel wird gezeigt, wie Sie einen vollwertigen Web-Client direkt in eine Qt-Anwendung einbetten und einen Hybrid erhalten, der wie eine native Anwendung aussieht, schnell arbeitet und dabei die volle Kraft moderner Webtechnologien nutzt. Sie werden entdecken, warum professionelle Entwickler immer häufiger auf Qt WebEngine setzen.

Es wird gezeigt, wie man mit wenigen Zeilen Code eine Webseite anzeigt, wie man den Navigationsverlauf verwaltet und das Laden von Ressourcen verfolgt. Im Text erscheinen konkrete Zahlen, architektonische Module von Qt6 und reale Beispiele hybrider Anwendungen, die diesen Ansatz bereits nutzen.

Wenn Sie dieses Kapitel auf später verschieben – besteht das Risiko, weiterhin redundanten Code zu schreiben und Zeit zu verlieren, wo bereits alles gelöst ist.

Das Kapitel enthält Code-Beispiele, die sofort einsatzbereit sind.

Selbstüberprüfung zum Kapitel

Warum wurde in Qt5.4 die WebKit-Engine durch Chromium ersetzt, und welche Vorteile brachte dies den Entwicklern?Antwort
Richtige Antwort: Chromium bot moderne Kompatibilität auf allen Plattformen, vollständige Integration in das Qt-Ökosystem (Signals/Slots, QML), die Möglichkeit der Interaktion zwischen JS und C++ über WebChannel sowie Kompaktheit im Vergleich zu Electron.
Warum wurde in Qt6 das WebEngine-Modul in drei separate Module aufgeteilt: Core, Widgets und Quick?Antwort
Richtige Antwort: Die Aufteilung ermöglicht es Anwendungen auf Qt Quick, keinen redundanten Widget-Code zu tragen, wodurch Größe reduziert und Leistung von Anwendungen ohne klassische Widgets verbessert wird.
Warum bietet Qt WebEngine keinen fertigen vollwertigen Browser als einzelnes Widget?Antwort
Richtige Antwort: Stattdessen wird ein „Baukasten” mit Komponenten bereitgestellt, der es dem Entwickler ermöglicht, einen Browser der gewünschten Konfiguration unter Verwendung anderer Qt-Widgets zu erstellen.
Was passiert, wenn der Benutzer die Adresse www.example.com ohne Protokollangabe eingibt, und wie sollte dies behandelt werden?Antwort
Richtige Antwort: Die Methode load() erkennt die Adresse möglicherweise nicht korrekt. Die Anwendung sollte den Anfang der Zeichenfolge prüfen und automatisch https:// hinzufügen, wenn das Protokoll fehlt.
Warum entfernt die Klasse QWebEngineHistory automatisch doppelte Einträge bei übereinstimmenden Adressen?Antwort
Richtige Antwort: Dies verhindert ein unkontrolliertes Wachstum der Verlaufsliste auf riesige Größen und macht den Navigationsverlauf praktisch nutzbar.
Was ist die Hauptschwierigkeit beim Laden von Webseiten, die Qt WebEngine vor dem Entwickler verbirgt?Antwort
Richtige Antwort: Das asynchrone Laden mehrerer Ressourcen (Bilder, CSS, JS, Frames), die unabhängig und in beliebiger Reihenfolge ankommen, mit Behandlung möglicher Netzwerk- und Serverfehler.
Welches Signal sollte verwendet werden, um einen Fortschrittsbalken beim Laden einer Seite anzuzeigen, und was überträgt es?Antwort
Richtige Antwort: Das Signal loadProgress() der Klasse QWebEngineView, das einen ganzzahligen Wert von 0 bis 100 überträgt, der den Prozentsatz des Ladefortschritts anzeigt.
Warum sollten die Slots back() und forward() von QWebEngineView mit Schaltflächen verbunden werden, wenn der Verlauf automatisch verwaltet wird?Antwort
Richtige Antwort: Die automatische Navigation funktioniert nur beim Klick auf Links; Schaltflächen geben dem Benutzer explizite Kontrolle über den Verlauf, um zu vorherigen Seiten zurückzukehren, ohne nach Links suchen zu müssen.
Was passiert mit der Benutzeroberfläche, wenn das Adressfeld nach dem Klicken auf einen Link nicht aktualisiert wird?Antwort
Richtige Antwort: Der Benutzer sieht eine veraltete Adresse, kann die aktuelle URL nicht korrekt kopieren oder Änderungen daran vornehmen, was die grundlegende Browser-Funktionalität beeinträchtigt.
Warum wird für Projekte mit WebEngine unter Windows MSVC und nicht MinGW empfohlen?Antwort
Richtige Antwort: MinGW kann Probleme bei der Arbeit mit dem WebEngine-Modul verursachen, während MSVC 2017+ eine stabile Kompilierung von Projekten mit diesem Modul gewährleistet.
In welchen Fällen ist eine hybride Anwendung (nativer Code + Web-Content) vorteilhafter als eine reine Web-Anwendung?Antwort
Richtige Antwort: Wenn Zugriff auf lokale Systemressourcen, native Interface-Leistung, OS-Integration oder Arbeit mit Daten außerhalb des Webs benötigt wird (Konfiguratoren, Kontrollpanels).
Wie sollte die Anwendung die Situation behandeln, wenn loadFinished() false zurückgibt?Antwort
Richtige Antwort: Den Benutzer über den Fehler informieren, zum Beispiel durch Aufrufen der Methode setHtml(), um eine Fehlermeldung über das Laden der Seite direkt im Browserfenster anzuzeigen.
Warum sind die Methoden canGoBack() und canGoForward() wichtig für die Steuerung des Zustands der Navigationsschaltflächen?Antwort
Richtige Antwort: Sie verhindern Navigationsversuche zu nicht existierenden Verlaufseinträgen, indem sie Schaltflächen nur dann aktiv machen, wenn ein Übergang tatsächlich möglich ist.
Was ist der grundlegende Unterschied zwischen der Architektur von VS Code (auf Electron) und dem Qt WebEngine-Ansatz?Antwort
Richtige Antwort: Electron verwendet Chromium + Node.js mit komplett HTML/JS-basierter UI, während Qt WebEngine die Web-Engine in eine native Anwendung einbettet und so größere Kompaktheit und Leistung bietet.
Was kann passieren, wenn man vergisst, webenginewidgets in der pro-Datei oder CMake hinzuzufügen?Antwort
Richtige Antwort: Der Compiler gibt den Fehler “Unknown module(s)” aus oder findet die Klassen QWebEngineView nicht; auch ist das Modul möglicherweise in minimalen Qt-Builds nicht vorhanden und erfordert Installation über das Maintenance Tool.

Praktische Aufgaben

Einfaches Niveau

Einfacher Dokumentations-Viewer
Erstellen Sie eine Anwendung, die lokale HTML-Dokumentation oder Hilfe anzeigt. Fügen Sie Schaltflächen „Zurück”, „Vorwärts” und „Home” (Rückkehr zur Startseite) hinzu. Implementieren Sie einen Seitenladeindikator mit QProgressBar.
Hinweise: Verwenden Sie QWebEngineView zur Anzeige. Verbinden Sie Schaltflächen mit den Slots back(), forward() und reload(). Verbinden Sie für den Indikator das Signal loadProgress() mit setValue() der Fortschrittsanzeige. Die Startseite kann über load(QUrl::fromLocalFile(“pfad/zur/datei.html”)) geladen werden.

Mittleres Niveau

Browser mit Verlaufsverwaltung
Entwickeln Sie einen Webbrowser mit Adresseingabefeld, automatischer URL-Validierung (Hinzufügen von https:// bei Bedarf), Steuerung der Navigationsschaltflächen (nur aktiv, wenn Übergang verfügbar) und Anzeige einer Liste besuchter Seiten. Fügen Sie eine Schaltfläche zum Löschen des Verlaufs hinzu.
Hinweise: Prüfen Sie in slotGo() den Anfang der Zeichenfolge mit der Methode startsWith(). Verwenden Sie QWebEngineHistory::canGoBack()/canGoForward() zur Steuerung des Schaltflächenzustands. Greifen Sie auf den Verlauf über webView->page()->history() zu. Verwenden Sie für die Seitenliste die Methoden items(), backItems() oder forwardItems(). Löschen – Methode clear().

Schwieriges Niveau

Hybride Anwendung mit lokalen und Web-Ressourcen
Erstellen Sie eine Konfigurator-Anwendung, die Webseiten mit Produktinformationen anzeigt, aber auch das Laden und Speichern von Konfigurationen in einer lokalen JSON-Datei ermöglicht. Implementieren Sie Tabs (QTabWidget) für gleichzeitiges Arbeiten mit mehreren Seiten, Fehlerbehandlung beim Laden mit informativer Meldung und die Möglichkeit, die aktuelle Seite als PDF zu exportieren.
Hinweise: Erstellen Sie ein QTabWidget und fügen Sie neue QWebEngineView hinzu. Verwenden Sie für JSON QJsonDocument. Führen Sie die Fehlerbehandlung im Slot loadFinished(bool) durch. Verwenden Sie für PDF-Export webView->page()->printToPdf(). Synchronisieren Sie die Adressleiste mit dem aktiven Tab über das Signal currentChanged() von QTabWidget. Erwägen Sie die Verwendung von QWebChannel für die Interaktion zwischen C++ und JavaScript.

💬 Beteiligen Sie sich an der Diskussion!

Die Integration von Web-Content in Qt-Anwendungen verstanden? Haben Sie Fragen dazu, wann der hybride Ansatz gewählt werden sollte?

Teilen Sie Ihre Erfahrungen beim Erstellen von Webbrowsern, berichten Sie über Schwierigkeiten bei der Arbeit mit Qt WebEngine oder helfen Sie anderen Lesern, die optimale Lösung für ihre Aufgaben zu finden!

Leave a Reply

Your email address will not be published. Required fields are marked *