En esta página

Migración de Qt WebKit a Qt WebEngine

Las siguientes secciones contienen información sobre cómo portar una aplicación que utiliza la API QWebView de Qt WebKit para utilizar la API. Qt WebEngine QWebEngineView.

Arquitectura

Chromium proporciona sus propios motores de red y pintura, que utiliza Qt WebEngine. Esto, entre otras cosas, permite a Qt WebEngine proporcionar un soporte mejor y más fiable para la última especificación HTML5 que Qt WebKit. Sin embargo, Qt WebEngine es también más pesado que Qt WebKit y no proporciona acceso directo a la pila de red y al documento HTML a través de las API de C++.

Nombres de las clases

El equivalente en Qt WebEngine de las clases C++ de Qt WebKit llevan el prefijo"QWebEngine" en lugar 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

Nombre del módulo Qt

En archivos de proyecto qmake

Qt WebKit

QT += webkitwidgets

Qt WebEngine

QT += webenginewidgets

Inclusión del módulo en los archivos fuente

Qt WebKit

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

Qt WebEngine

#include <QtWebEngineWidgets/QtWebEngineWidgets>

QWebFrame se ha fusionado con QWebEnginePage

Los marcos HTML pueden utilizarse para dividir las páginas web en varias áreas en las que el contenido puede representarse individualmente.

En Qt WebKit, QWebFrame representa un marco dentro de una página web. Cada objeto QWebPage contiene al menos un marco, el marco principal, obtenido mediante QWebPage::mainFrame(). Se crearán marcos adicionales para el elemento HTML <frame>, que define la apariencia y el contenido de un único marco, o el elemento <iframe>, que inserta un marco dentro de un bloque de texto.

En Qt WebEngine, el manejo de los marcos se ha fusionado en la clase QWebEnginePage. Todos los marcos hijos se consideran ahora parte del contenido, y sólo son accesibles a través de JavaScript. Los métodos de la clase QWebFrame, como load() están ahora disponibles directamente a través del propio 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);

Algunos métodos devuelven ahora su resultado de forma asíncrona

Debido a que Qt WebEngine utiliza una arquitectura multiproceso, las llamadas a algunos métodos desde las aplicaciones devolverán inmediatamente, mientras que los resultados deben recibirse de forma asíncrona a través de un mecanismo de devolución de llamada. Se debe proporcionar un puntero de función, un functor o una expresión lambda para manejar los resultados cuando estén 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 (con una función 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 (con una plantilla functor que envuelve una función miembro)

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 (con un functor 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 No interactúa con QNetworkAccessManager

Algunas clases de Qt Network como QAuthenticator fueron reutilizadas para su interfaz pero, a diferencia de Qt WebKit, Qt WebEngine tiene su propia implementación HTTP y no puede pasar por un QNetworkAccessManager.

Las señales y métodos de QNetworkAccessManager que aún son soportados fueron movidos a la clase 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*)));

Nota: En Qt WebEngine, el QAuthenticator debe ser explícitamente establecido a null para cancelar la autenticación:

*authenticator = QAuthenticator();

La omisión de QNetworkAccessManager también afecta a la forma en que se gestionan los certificados. Para obtener más información, consulte Gestión de certificados.

Notas sobre métodos individuales

evaluateJavaScript

QWebFrame::evaluateJavaScript fue movido y renombrado como QWebEnginePage::runJavaScript. Actualmente sólo es posible ejecutar JavaScript en el marco principal de una página y el resultado se devuelve de forma asíncrona al functor proporcionado.

Qt WebKit

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

Qt WebEngine (con expresiones lambda en C++11)

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

setHtml y setContent

QWebEnginePage::setHtml y QWebEnginePage::setContent se ejecutan de forma asíncrona como lo haría una carga HTTP normal, a diferencia de sus homólogos QWebPage.

setContentEditable

QWebPage::setContentEditable no tiene equivalente ya que cualquier elemento del documento puede hacerse editable a través del atributo contentEditable del último estándar HTML. Por lo tanto, QWebEnginePage::runJavaScript es todo lo que se necesita.

Qt WebKit

QWebPage page;
page.setContentEditable(true);

Qt WebEngine

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

API Qt WebKit no disponible

Las clases y métodos Qt WebKit de esta lista no estarán disponibles en Qt WebEngine.

QGraphicsWebViewQt WebEngine está diseñado para ser utilizado con aceleración por hardware. Debido a que no podemos soportar una clase de vista web en QGraphicsView a menos que se adjunte a una ventana gráfica QGLWidget, esta característica está fuera de alcance.
QWebElementQt WebEngine utiliza una arquitectura multiproceso y esto significa que cualquier acceso a la estructura interna de la página tiene que hacerse de forma asíncrona, cualquier resultado de consulta debe ser devuelto a través de callbacks. La API de QWebElement fue diseñada para acceso sincrónico y esto requeriría un rediseño completo.
QWebDatabaseLa función Web SQL Database que esta API envolvía en Qt WebKit fue eliminada del estándar HTML5.
QWebPluginDatabase, QWebPluginFactory, QWebPluginInfo, QWebPage::setPalette, QWebView::setRenderHintsQt WebEngine renderiza páginas web utilizando Skia y no utiliza QPainter o Qt para este fin. El estándar HTML5 también ofrece ahora alternativas mucho mejores que no estaban disponibles cuando se introdujeron los plugins de controles nativos en Qt WebKit.
QWebHistoryInterfaceLos enlaces visitados se guardan automáticamente en Qt WebEngine.
QWebPage::setContentEditableEn el último estándar HTML, cualquier elemento del documento puede hacerse editable a través del atributo contentEditable. Así que runJavaScript es todo lo que se necesita: page->runJavaScript("document.documentElement.contentEditable = true")
QWebPage::setLinkDelegationPolicyNo hay forma de conectar una señal para ejecutar código C++ cuando se pulsa un enlace. Sin embargo, los clicks de enlaces pueden ser delegados a la aplicación Qt en lugar de que el motor HTML handler los procese sobrecargando la función QWebEnginePage::acceptNavigationRequest(). Esto es necesario cuando se utiliza un documento HTML como parte de la interfaz de usuario, y no para mostrar datos externos, por ejemplo, al mostrar una lista de resultados.

Nota: acceptNavigationRequest() inicia el proceso de carga y emite la señal loadStarted() antes de que la solicitud sea aceptada o rechazada. Por lo tanto, cabe esperar una señal loadFinished() que devuelva false incluso después de delegar la solicitud.

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