Portierung von Qt WebKit nach Qt WebEngine

Die folgenden Abschnitte enthalten Informationen über die Portierung einer Anwendung, die die Qt WebKit QWebView API verwendet, um die Qt WebEngine QWebEngineView.

Architektur

Chromium bietet seine eigenen Netzwerk- und Mal-Engines, die Qt WebEngine verwendet. Dies ermöglicht es Qt WebEngine unter anderem, eine bessere und zuverlässigere Unterstützung für die neueste HTML5-Spezifikation als Qt WebKit zu bieten. Allerdings ist Qt WebEngine damit auch schwerer als Qt WebKit und bietet keinen direkten Zugriff auf den Netzwerk-Stack und das HTML-Dokument über C++-APIs.

Klassennamen

Die Qt WebEngine Äquivalente der Qt WebKit C++ Klassen werden mit dem Präfix"QWebEngine" anstelle von"QWeb" versehen.

Qt WebKit

#include <QWebHistory>
#include <QWebHistoryItem>
#include <QWebPage>
#include <QWebView>

QWebHistory
QWebHistoryItem
QWebPage
QWebView

Qt WebEngine

#include <QWebEngineHistory>
#include <QWebEngineHistoryItem>
#include <QWebEnginePage>
#include <QWebEngineView>

QWebEngineHistory
QWebEngineHistoryItem
QWebEnginePage
QWebEngineView

Name des Qt-Moduls

In qmake Projektdateien

Qt WebKit

QT += webkitwidgets

Qt WebEngine

QT += webenginewidgets

Einbindung des Moduls in Quelldateien

Qt WebKit

#include <QtWebKit/QtWebKit>
#include <QtWebKitWidgets/QtWebKitWidgets> // With Qt >= 4.8

Qt WebEngine

#include <QtWebEngineWidgets/QtWebEngineWidgets>

QWebFrame wurde in QWebEnginePage verschmolzen

HTML-Frames können verwendet werden, um Webseiten in mehrere Bereiche zu unterteilen, in denen der Inhalt individuell dargestellt werden kann.

In Qt WebKit repräsentiert QWebFrame einen Frame innerhalb einer Webseite. Jedes QWebPage-Objekt enthält mindestens einen Frame, den Hauptframe, der mit QWebPage::mainFrame() erzeugt wird. Zusätzliche Frames werden für das HTML-Element <frame> erstellt, das das Aussehen und den Inhalt eines einzelnen Frames definiert, oder für das Element <iframe>, das einen Frame innerhalb eines Textblocks einfügt.

In Qt WebEngine wurde die Behandlung von Frames in die Klasse QWebEnginePage integriert. Alle untergeordneten Frames werden nun als Teil des Inhalts betrachtet und sind nur über JavaScript zugänglich. Methoden der Klasse QWebFrame, wie z. B. load(), sind jetzt direkt über QWebEnginePage selbst verfügbar.

Qt WebKit

QWebPage page;
connect(page.mainFrame(), SIGNAL(urlChanged(const QUrl&)), SLOT(mySlotName()));
page.mainFrame()->load(url);

Qt WebEngine

QWebEnginePage page;
connect(&page, SIGNAL(urlChanged(const QUrl&)), SLOT(mySlotName()));
page.load(url);

Einige Methoden geben ihr Ergebnis nun asynchron zurück

Da Qt WebEngine eine Multiprozess-Architektur verwendet, kehren einige Methodenaufrufe aus Anwendungen sofort zurück, während die Ergebnisse asynchron über einen Callback-Mechanismus empfangen werden sollten. Ein Funktionszeiger, ein Funktor oder ein Lambda-Ausdruck muss bereitgestellt werden, um die Ergebnisse zu verarbeiten, wenn sie verfügbar sind.

Qt WebKit

QWebPage *page = new QWebPage;
QTextEdit *textEdit = new QTextEdit;
// *textEdit is modified immediately.
textEdit->setPlainText(page->toHtml());
textEdit->setPlainText(page->toPlainText());

Qt WebEngine (mit einer Lambda-Funktion in C++11)

QWebEnginePage *page = new QWebEnginePage;
QTextEdit *textEdit = new QTextEdit;
// *textEdit must remain valid until the lambda function is called.
page->toHtml([textEdit](const QString &result){ textEdit->setPlainText(result); });
page->toPlainText([textEdit](const QString &result){ textEdit->setPlainText(result); });

Qt WebEngine (mit einer Funktormvorlage, die eine Mitgliedsfunktion umhüllt)

template<typename Arg, typename R, typename C>
struct InvokeWrapper {
    R *receiver;
    void (C::*memberFun)(Arg);
    void operator()(Arg result) {
        (receiver->*memberFun)(result);
    }
};

template<typename Arg, typename R, typename C>
InvokeWrapper<Arg, R, C> invoke(R *receiver, void (C::*memberFun)(Arg))
{
    InvokeWrapper<Arg, R, C> wrapper = {receiver, memberFun};
    return wrapper;
}

QWebEnginePage *page = new QWebEnginePage;
QTextEdit *textEdit = new QTextEdit;
// *textEdit must remain valid until the functor is called.
page->toHtml(invoke(textEdit, &QTextEdit::setPlainText));
page->toPlainText(invoke(textEdit, &QTextEdit::setPlainText));

Qt WebEngine (mit einem regulären Funktor)

struct SetPlainTextFunctor {
    QTextEdit *textEdit;
    SetPlainTextFunctor(QTextEdit *textEdit) : textEdit(textEdit) { }
    void operator()(const QString &result) {
        textEdit->setPlainText(result);
    }
};

QWebEnginePage *page = new QWebEnginePage;
QTextEdit *textEdit = new QTextEdit;
// *textEdit must remain valid until the functor is called.
page->toHtml(SetPlainTextFunctor(textEdit));
page->toPlainText(SetPlainTextFunctor(textEdit));

Qt WebEngine Hat keine Wechselwirkung mit QNetworkAccessManager

Einige Klassen von Qt Network wie z.B. QAuthenticator wurden für ihre Schnittstelle wiederverwendet, aber im Gegensatz zu Qt WebKit hat Qt WebEngine seine eigene HTTP-Implementierung und kann nicht durch eine QNetworkAccessManager gehen.

Die Signale und Methoden von QNetworkAccessManager, die noch unterstützt werden, wurden in die Klasse QWebEnginePage verschoben.

Qt WebKit

QNetworkAccessManager qnam;
QWebPage page;
page.setNetworkAccessManager(&qnam);
connect(&qnam, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)), this, SLOT(authenticate(QNetworkReply*,QAuthenticator*)));

Qt WebEngine

QWebEnginePage page;
connect(&page, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)), this, SLOT(authenticate(QNetworkReply*,QAuthenticator*)));

Hinweis: In Qt WebEngine muss die QAuthenticator explizit auf null gesetzt werden, um die Authentifizierung abzubrechen:

*authenticator = QAuthenticator();

Das Weglassen von QNetworkAccessManager wirkt sich auch auf die Art und Weise aus, in der Zertifikate verwaltet werden. Weitere Informationen finden Sie unter Verwalten von Zertifikaten.

Hinweise zu einzelnen Methoden

evaluateJavaScript

QWebFrame::evaluateJavaScript wurde verschoben und in QWebEnginePage::runJavaScript umbenannt. Es ist derzeit nur möglich, JavaScript auf dem Hauptframe einer Seite auszuführen, und das Ergebnis wird asynchron an den bereitgestellten Funktor zurückgegeben.

Qt WebKit

QWebPage *page = new QWebPage;qDebug() << page->mainFrame()->evaluateJavaScript("'Java' + 'Script'");

Qt WebEngine (mit Lambda-Ausdrücken in C++11)

QWebEnginePage *page = new QWebEnginePage;
page->runJavaScript("'Java' + 'Script'", [](const QVariant &result){ qDebug() << result; });

setHtml und setContent

QWebEnginePage::setHtml und QWebEnginePage::setContent werden asynchron wie ein normaler HTTP-Ladevorgang ausgeführt, im Gegensatz zu ihren QWebPage-Gegenstücken.

setContentEditable

QWebPage::setContentEditable hat keine Entsprechung, da jedes Dokumentenelement durch das Attribut contentEditable im aktuellen HTML-Standard editierbar gemacht werden kann. Daher ist QWebEnginePage::runJavaScript alles, was benötigt wird.

Qt WebKit

QWebPage page;
page.setContentEditable(true);

Qt WebEngine

QWebEnginePage page;
page.runJavaScript("document.documentElement.contentEditable = true");

Nicht verfügbare Qt WebKit API

Die Qt WebKit-Klassen und -Methoden in dieser Liste werden in Qt WebEngine nicht verfügbar sein.

QGraphicsWebViewQt WebEngine ist für die Verwendung mit Hardwarebeschleunigung konzipiert. Da wir eine WebView-Klasse in QGraphicsView nur dann unterstützen können, wenn sie an ein QGLWidget-Viewport angehängt ist, ist diese Funktion nicht verfügbar.
QWebElementQt WebEngine verwendet eine Multiprozess-Architektur und das bedeutet, dass jeder Zugriff auf die interne Struktur der Seite asynchron erfolgen muss, jedes Abfrageergebnis muss durch Callbacks zurückgegeben werden. Die QWebElement-API wurde für den synchronen Zugriff konzipiert, was ein komplettes Redesign erfordern würde.
QWebDatabaseDie Web-SQL-Datenbankfunktion, die diese API in Qt WebKit verpackte, wurde aus dem HTML5-Standard gestrichen.
QWebPluginDatabase, QWebPluginFactory, QWebPluginInfo, QWebPage::setPalette, QWebView::setRenderHintsQt WebEngine rendert Webseiten mit Skia und verwendet dafür nicht QPainter oder Qt. Der HTML5-Standard bietet jetzt auch viel bessere Alternativen, die nicht zur Verfügung standen, als die Plugins für native Steuerelemente in Qt WebKit eingeführt wurden.
QWebHistoryInterfaceBesuchte Links werden automatisch von Qt WebEngine persistiert.
QWebPage::setContentEditableIm neuesten HTML-Standard kann jedes Dokumentenelement durch das Attribut contentEditable editierbar gemacht werden. Somit ist runJavaScript alles, was benötigt wird: page->runJavaScript("document.documentElement.contentEditable = true")
QWebPage::setLinkDelegationPolicyEs gibt keine Möglichkeit, ein Signal zu verbinden, um C++-Code auszuführen, wenn ein Link angeklickt wird. Jedoch können Link-Klicks an die Qt-Anwendung delegiert werden, anstatt sie von der HTML-Handler-Engine verarbeiten zu lassen, indem die Funktion QWebEnginePage::acceptNavigationRequest() überladen wird. Dies ist notwendig, wenn ein HTML-Dokument als Teil der Benutzeroberfläche verwendet wird, und nicht um externe Daten anzuzeigen, z.B. bei der Anzeige einer Ergebnisliste.

Hinweis: acceptNavigationRequest() startet den Ladevorgang und sendet das Signal loadStarted() , bevor die Anfrage angenommen oder abgelehnt wird. Daher ist ein loadFinished()-Signal, das false zurückgibt, auch nach der Delegierung der Anfrage zu erwarten.

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.