Sur cette page

Portage de Qt WebKit vers Qt WebEngine

Les sections suivantes contiennent des informations sur le portage d'une application qui utilise l'API Qt WebKit QWebView pour utiliser l'API Qt WebEngine QWebEngineView.

Architecture

Chromium fournit ses propres moteurs de réseau et de peinture, que Qt WebEngine utilise. Cela permet notamment à Qt WebEngine de fournir une prise en charge meilleure et plus fiable de la dernière spécification HTML5 que Qt WebKit. Cependant, Qt WebEngine est donc également plus lourd que Qt WebKit et ne fournit pas d'accès direct à la pile réseau et au document HTML par le biais d'API C++.

Noms des classes

L'équivalent Qt WebEngine des classes C++ de Qt WebKit est préfixé par"QWebEngine" au lieu de"QWeb".

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

Nom du module Qt

Dans les fichiers du projet qmake

Qt WebKit

QT += webkitwidgets

Qt WebEngine

QT += webenginewidgets

Inclure le module dans les fichiers sources

Qt WebKit

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

Qt WebEngine

#include <QtWebEngineWidgets/QtWebEngineWidgets>

QWebFrame a été fusionné avec QWebEnginePage

Les cadres HTML peuvent être utilisés pour diviser les pages web en plusieurs zones où le contenu peut être représenté individuellement.

Dans Qt WebKit, QWebFrame représente un cadre à l'intérieur d'une page web. Chaque objet QWebPage contient au moins un cadre, le cadre principal, obtenu à l'aide de QWebPage::mainFrame(). Des cadres supplémentaires seront créés pour l'élément HTML <frame>, qui définit l'apparence et le contenu d'un cadre unique, ou l'élément <iframe>, qui insère un cadre dans un bloc de texte.

Dans Qt WebEngine, la gestion des cadres a été fusionnée dans la classe QWebEnginePage. Tous les cadres enfants sont désormais considérés comme faisant partie du contenu et ne sont accessibles que par JavaScript. Les méthodes de la classe QWebFrame, telles que load(), sont désormais accessibles directement via l'élément QWebEnginePage.

Qt WebKit

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

Qt WebEngine

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

Certaines méthodes renvoient désormais leur résultat de manière asynchrone

Étant donné que Qt WebEngine utilise une architecture multiprocessus, les appels à certaines méthodes des applications renverront immédiatement le résultat, alors que les résultats doivent être reçus de manière asynchrone par le biais d'un mécanisme de rappel. Un pointeur de fonction, un foncteur ou une expression lambda doit être fourni pour gérer les résultats lorsqu'ils sont disponibles.

Qt WebKit

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

Qt WebEngine (avec une fonction lambda en 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 (avec un modèle de foncteur enveloppant une fonction membre)

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 (avec un foncteur normal)

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 N'interagit pas avec QNetworkAccessManager

Certaines classes de Qt Network comme QAuthenticator ont été réutilisées pour leur interface mais, contrairement à Qt WebKit, Qt WebEngine a sa propre implémentation HTTP et ne peut pas passer par QNetworkAccessManager.

Les signaux et méthodes de QNetworkAccessManager qui sont encore supportés ont été déplacés dans la classe QWebEnginePage.

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*)));

Note : Dans Qt WebEngine, la valeur de QAuthenticator doit être explicitement fixée à null pour annuler l'authentification :

*authenticator = QAuthenticator();

L'omission de QNetworkAccessManager affecte également la manière dont les certificats sont gérés. Pour plus d'informations, voir Gestion des certificats.

Remarques sur les méthodes individuelles

evaluateJavaScript

QWebFrame::evaluateJavaScript a été déplacé et renommé QWebEnginePage::runJavaScript. Il n'est actuellement possible d'exécuter JavaScript que sur le cadre principal d'une page et le résultat est renvoyé de manière asynchrone au foncteur fourni.

Qt WebKit

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

Qt WebEngine (avec des expressions lambda en C++11)

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

setHtml et setContent

QWebEnginePage::setHtml et QWebEnginePage::setContent s'exécutent de manière asynchrone, comme le ferait un chargement HTTP normal, contrairement à leurs homologues de QWebPage.

setContentEditable

QWebPage::setContentEditable n'a pas d'équivalent puisque tout élément de document peut être rendu modifiable grâce à l'attribut contentEditable de la dernière norme HTML. Par conséquent, QWebEnginePage::runJavaScript est tout ce qui est nécessaire.

Qt WebKit

QWebPage page;
page.setContentEditable(true);

Qt WebEngine

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

API Qt WebKit indisponible

Les classes et méthodes Qt WebKit de cette liste ne seront pas disponibles sur Qt WebEngine.

QGraphicsWebViewQt WebEngine est conçu pour être utilisé avec l'accélération matérielle. Parce que nous ne pourrions pas supporter une classe de vue Web dans un site QGraphicsView à moins qu'elle ne soit attachée à un viewport QGLWidget, cette fonctionnalité est hors de portée.
QWebElementQt WebEngine utilise une architecture multiprocessus, ce qui signifie que tout accès à la structure interne de la page doit être effectué de manière asynchrone, et que tout résultat de requête doit être renvoyé par le biais de rappels. L'API de QWebElement a été conçue pour un accès synchrone et cela nécessiterait une refonte complète.
QWebDatabaseLa fonctionnalité de base de données Qt SQL que cette API intégrait dans Qt WebKit a été supprimée de la norme HTML5.
QWebPluginDatabase, QWebPluginFactory, QWebPluginInfo, QWebPage::setPalette, QWebView::setRenderHintsQt WebEngine effectue le rendu des pages web à l'aide de Skia et n'utilise pas QPainter ou Qt à cette fin. La norme HTML5 offre également de bien meilleures alternatives qui n'étaient pas disponibles lorsque les plugins de contrôles natifs ont été introduits dans Qt WebKit.
QWebHistoryInterfaceLes liens visités sont automatiquement conservés par Qt WebEngine.
QWebPage::setContentEditableDans la dernière norme HTML, tout élément de document peut être rendu modifiable grâce à l'attribut contentEditable. L'adresse runJavaScript est donc tout ce qui est nécessaire : page->runJavaScript("document.documentElement.contentEditable = true")
QWebPage::setLinkDelegationPolicyIl n'existe aucun moyen de connecter un signal pour exécuter du code C++ lorsqu'un lien est cliqué. Cependant, les clics sur les liens peuvent être délégués à l'application Qt XML au lieu d'être traités par le moteur de traitement HTML en surchargeant la fonction QWebEnginePage::acceptNavigationRequest(). Cela est nécessaire lorsqu'un document HTML est utilisé dans le cadre de l'interface utilisateur et non pour afficher des données externes, par exemple lors de l'affichage d'une liste de résultats.

Remarque : la fonctionacceptNavigationRequest() lance le processus de chargement et émet le signal loadStarted() avant que la demande ne soit acceptée ou rejetée. Par conséquent, il faut s'attendre à ce que le signal loadFinished() renvoie false même après avoir délégué la demande.

© 2026 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.