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.
QGraphicsWebView | Qt 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. |
QWebElement | Qt 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. |
QWebDatabase | Die Web-SQL-Datenbankfunktion, die diese API in Qt WebKit verpackte, wurde aus dem HTML5-Standard gestrichen. |
QWebPluginDatabase, QWebPluginFactory, QWebPluginInfo, QWebPage::setPalette, QWebView::setRenderHints | Qt 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. |
QWebHistoryInterface | Besuchte Links werden automatisch von Qt WebEngine persistiert. |
QWebPage::setContentEditable | Im 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::setLinkDelegationPolicy | Es 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 |
© 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.