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 QWebPage;qDebug() << 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 では利用できません。
QGraphicsWebView | Qt WebEngine は、ハードウェア・アクセラレーションとともに使用するように設計されています。QGLWidget ビューポートにアタッチされない限り、 で Web ビュークラスをサポートできないため、この機能は対象外です。QGraphicsView |
QWebElement | Qt WebEngine はマルチプロセスアーキテクチャを使用しており、これはページの内部構造へのアクセスはすべて非同期で行われなければならないことを意味します。QWebElement API は同期アクセス用に設計されているため、完全な再設計が必要になります。 |
QWebDatabase | この API が Qt WebKit でラップしていた Web SQL データベース機能は、HTML5 標準から削除されました。 |
QWebPluginDatabase, QWebPluginFactory, QWebPluginInfo, QWebPage::setPalette, QWebView::setRenderHints | Qt 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 ()シグナルを発する。したがって、 |
© 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.