Qt WebKit からQt WebEngine

以下のセクションでは、Qt WebKit QWebView API を使用しているアプリケーションを Qt WebEngineQWebEngineView.

アーキテクチャ

Chromium は独自のネットワークエンジンとペインティングエンジンを提供しており、Qt WebEngine はそれを使用しています。これにより、Qt WebEngine は Qt WebKit よりも最新の HTML5 仕様をより良く、より確実にサポートすることができます。しかし、Qt WebEngine は Qt WebKit よりも重く、C++ API を通じてネットワークスタックや HTML ドキュメントに直接アクセスすることはできません。

クラス名

Qt WebEngine に相当する Qt WebKit C++ クラスのプレフィックスは、"QWeb" ではなく"QWebEngine"です。

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

Qt モジュール名

qmakeプロジェクトファイル内

Qt WebKit

QT += webkitwidgets

Qt WebEngine

QT += webenginewidgets

ソースファイルにモジュールをインクルードする

Qt WebKit

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

Qt WebEngine

#include <QtWebEngineWidgets/QtWebEngineWidgets>

QWebFrame は QWebEnginePage に統合されました。

HTML フレームは、ウェブページをいくつかの領域に分割し、コンテンツを個別に表現するために使用できます。

Qt WebKit では、QWebFrame が Web ページ内のフレームを表します。各 QWebPage オブジェクトには、QWebPage::mainFrame() を使用して取得したメインフレームが少なくとも 1 つ含まれています。追加のフレームは、1 つのフレームの外観と内容を定義する HTML<frame> 要素、またはテキストのブロック内にフレームを挿入する<iframe> 要素のために作成されます。

Qt WebEngine で、フレーム処理はQWebEnginePage クラスに統合されました。すべての子フレームはコンテンツの一部とみなされ、JavaScript でのみアクセスできるようになりました。load() などの QWebFrame クラスのメソッドは、QWebEnginePage 自体から直接利用できるようになりました。

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

いくつかのメソッドが結果を非同期で返すようになった

Qt WebEngine はマルチプロセスアーキテクチャを採用しているため、アプリケーションからいくつかのメソッドを呼び出すと即座に結果を返すが、結果はコールバックメカニズムによって非同期に受け取る必要がある。関数ポインタ、ファンクタ、またはラムダ式は、結果が利用可能になったときに処理するために提供されなければならない。

Qt WebKit

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

Qt WebEngine (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 (メンバ関数をラップするファンクタ・テンプレート付き)

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 (通常のファンクターで)

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 QNetworkAccessManagerと相互作用しない

QAuthenticator のようなQt Network のいくつかのクラスは、そのインターフェイスのために再利用されましたが、Qt WebKit とは異なり、Qt WebEngine は独自の HTTP 実装を持っており、QNetworkAccessManager を経由することはできません。

まだサポートされているQNetworkAccessManager のシグナルとメソッドは、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*)));

注意: Qt WebEngine では、認証をキャンセルするにはQAuthenticator を明示的に null に設定する必要があります:

*authenticator = QAuthenticator();

QNetworkAccessManager を省略すると、証明書の管理方法にも影響する。詳細については、証明書の管理 を参照のこと。

個々のメソッドに関する注意事項

evaluateJavaScript

QWebFrame::evaluateJavaScript は移動され、QWebEnginePage::runJavaScript という名前に変更されました。現在、ページのメインフレームでのみ JavaScript を実行することが可能で、結果は提供されたファンクタに非同期で返されます。

Qt WebKit

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

Qt WebEngine (C++11ではラムダ式で)

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

setHtml と setContent

QWebEnginePage::setHtml および は、QWebPage の対応するものとは異なり、通常の HTTP ロードと同じように非同期に実行されます。QWebEnginePage::setContent

setContentEditable

QWebPage::setContentEditable は、最新の HTML 標準の contentEditable 属性を通して、どんなドキュメント要素でも編集可能にすることができるので、同等のものはありません。そのため、QWebEnginePage::runJavaScript が必要です。

Qt WebKit

QWebPage page;
page.setContentEditable(true);

Qt WebEngine

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

利用できない Qt WebKit API

このリストにある Qt WebKit のクラスとメソッドは、Qt WebEngine では利用できません。

QGraphicsWebViewQt WebEngine は、ハードウェア・アクセラレーションとともに使用するように設計されています。QGLWidget ビューポートにアタッチされない限り、 で Web ビュークラスをサポートできないため、この機能は対象外です。QGraphicsView
QWebElementQt WebEngine はマルチプロセスアーキテクチャを使用しており、これはページの内部構造へのアクセスはすべて非同期で行われなければならないことを意味します。QWebElement API は同期アクセス用に設計されているため、完全な再設計が必要になります。
QWebDatabaseこの API が Qt WebKit でラップしていた Web SQL データベース機能は、HTML5 標準から削除されました。
QWebPluginDatabase, QWebPluginFactory, QWebPluginInfo, QWebPage::setPalette, QWebView::setRenderHintsQt WebEngine は Skia を使用してウェブページをレンダリングし、この目的のために や Qt を使用していません。HTML5 標準は、Qt WebKit でネイティブコントロールプラグインが導入されたときには利用できなかった、はるかに優れた代替手段を提供します。QPainter
QWebHistoryInterface訪問したリンクはQt WebEngine によって自動的に永続化されます。
QWebPage::setContentEditable最新の HTML 標準では、どの文書要素もcontentEditable 属性を通して編集可能にすることができます。そのため、runJavaScript がすべて必要です:page->runJavaScript("document.documentElement.contentEditable = true")
QWebPage::setLinkDelegationPolicyリンクがクリックされたときに C++ コードを実行するシグナルを接続する方法はありません。しかし、QWebEnginePage::acceptNavigationRequest ()関数をオーバーロードすることで、HTMLハンドラエンジンに処理させる代わりに、リンククリックをQtアプリケーションに委譲することができます。これは、HTMLドキュメントをユーザーインターフェースの一部として使用し、外部データを表示しない場合(例えば、結果のリストを表示する場合など)に必要です。

注: acceptNavigationRequest ()は読み込み処理を開始し、要求が受諾されるか拒否される前に loadStarted ()シグナルを発する。したがって、false を返すloadFinished() シグナルは、リクエストを委譲した後でも期待される。

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