Qtブログ(日本語)

C++ と Qt Widgets で WebView モジュールを利用

作成者: Qt Group 日本オフィス|May 31, 2026 1:46:10 PM
このブログは「Using the WebView module with C++ and Qt Widgets」の抄訳です。

これまで、Qt ベースの C++ アプリケーションで Web コンテンツを埋め込む手段は Qt WebEngine 一択でした。豊富な API と多彩な機能を持つ一方、システムリソースの消費量が多く、バイナリサイズも増大するという欠点があります。QML ユーザー向けには Qt WebView モジュールという代替手段がありましたが、その API がこれまで C++ に公開されることはありませんでした。 

Qt 6.11 では、Qt WebView の C++ API をテクノロジープレビューとしてリリースしました。本記事では、新しい C++ API の使い方を簡単に紹介し、QML 版との違いについて説明します。既存の QML API にできる限り近づけるよう努めましたが、一部変更点もあります。実際に利用を検討されている開発者の方々からのフィードバックをお待ちしています。

まず概要を説明します。WebEngine と WebView はどちらも Web コンテンツをアプリケーションに埋め込むための API ですが、Qt WebEngine がアプリケーション内に Chromium ランタイムを直接組み込むのに対し、Qt WebView はシステムが提供する Web ライブラリの薄いラッパーとして動作します(システムライブラリが存在しない場合は WebEngine をラップします)。これによりアプリケーションのリソース消費を抑えられ、セキュリティアップデートも OS が自動的に行うため、更新を自分で管理する手間がありません。サポートプラットフォームの一覧は以下のとおりです。

  Windows  Linux macOS iOS Android WebAssembly
システムバックエンド Microsoft Edge WebView2 N/A WkWebView  WkWebView  Android WebView <iframe> (ナビゲーションなし)

WebEngine バックエンドのサポート

 ✓   ✓   ✓   ✗   ✗   ✗ 

Qt WebView のバックエンドとして使用するネイティブ API は、埋め込み可能なウィンドウをユーザーに提供する仕組みで動作します。そのため、QWebView クラスを QWindow のサブクラスとして実装することにしました。これにより、ウィンドウをアプリケーションに埋め込む方法をユーザーが自由に選択できます。Qt Widgets ユーザーにとって最も簡単な方法は、次のように QWidget::createWindowContainer() を呼び出すことです。 

WebView webview;
QWidget *webViewContainer = QWidget::createWindowContainer(webView); 
QBoxLayout layout;
layout.addWidget(webViewContainer);

 

QWindow::setParent() を使って位置を手動で管理することも可能です。両方のアプローチの詳細については、ドキュメントを参照してください。

ウィンドウをアプリ内の適切な場所に配置したら、あとは setUrl() を呼び出すだけで、バックエンドが残りの処理を行います。goBack()goForward()reload()stop() の各スロットにボタンを接続すれば、シンプルな Web ブラウジング機能が完成します。ナビゲーションの変化、タイトルの変更、新しい Cookie の追加を検知するためのシグナルも複数提供しています。また、runJavaScript() 関数を使って Web ページにコードを注入することもでき、resultCallback パラメーターで Web コンテンツから C++ へ情報を取り出すことができます。

WebView webview;

webView.runJavaScript(QString(QLatin1String("document.title")), [](const QVariant &result) { 
    qDebug() << result.toString(); // ページのタイトルをコンソールに出力

});

QWebView::loadingChanged() シグナルを処理すると、最新のロード状態、URL、エラーメッセージを含む QWebViewLoadingInfo オブジェクトにアクセスできます。これは QML の WebViewLoadRequest オブジェクトに相当しますが、C++ 実装においてより適切な名前に変更しました。

QWebView::settings() を呼び出して QWebViewSettings オブジェクトを取得することで、現在の WebView の動作を変更できます。設定オブジェクトは QWebView インスタンスごとに 1 つ紐づいているため、ライフタイム管理の心配は不要で、同時に実行される複数の WebView に異なる設定を適用することも可能です。

QML とは異なり、設定ごとに個別のプロパティを追加するのではなく、利用可能なすべての設定タイプを表す WebAttribute 列挙型と、その値を変更する setAttribute() および testAttribute() 関数を用意しました。現在は 4 種類の設定タイプのみに対応しており、詳細はこちらで確認できます。

Qt WebView モジュールの開発をさらに進め、Qt WebEngine との機能差を縮めていく予定です。皆さんのユースケースにとって重要な機能についてのフィードバックをお聞かせください。また、テクノロジープレビューを終了して API を固定する前に、現在の実装に関するご意見もぜひお寄せください。バグトラッカーをご確認のうえ、まだ登録されていない問題があればチケットを作成していただければ幸いです。