Qtと他のUIツールキットの併用
Qtは、アプリケーション開発のニーズの大部分を網羅する、包括的なクロスプラットフォームUIコンポーネントおよびコントロールのセットを提供しています。しかし、Qtを他のUIツールキットと統合することが必要になったり、有益になったりする状況もあります。
その一例として、他のツールキットで構築されたアプリケーションにQtのUIを組み込むケースが挙げられます。例えば、既存のアプリケーション用のプラグインを実装する場合や、既存のコードベースにQtを段階的に導入する場合などです。
もう一つのシナリオは、Qtアプリケーション内でネイティブまたはサードパーティのUI要素をホストすることです。例えば、Qtが提供していない特殊なコントロールにアクセスする場合などが挙げられます。
ここでは、これら2つのユースケースを解決するためのさまざまな側面について見ていきます。
外部ウィンドウ
Qt を他の UI ツールキットと統合するには、まず、そのプラットフォームの基本的な UI 構成要素の共通表現が必要です。Qt では、これはWId 型によって表されます。これは不透明なハンドルであり、どのネイティブ型にマッピングされるかはプラットフォームごとに定義が異なります。
| Platform | WId 型 |
|---|---|
| macOS | NSView* |
| Windows | HWND |
| X11 | xcb_window_t |
| iOS | UIView* |
| Android | 表示 |
| WebAssembly | emscripten::val* |
次のステップは、そのネイティブハンドルを、Qtが操作可能な形式でラップすることです。QtのQWindow 抽象化を基に、ネイティブハンドルのQWindow 表現を作成します。
この方法で作成されたウィンドウは、Qt にとって「外部」の UI ツールキットによって作成されたコントロールを表しているため、Qt では「外部ウィンドウ」と呼ばれます。
注:Qt は 、foreign window を作成する際にネイティブウィンドウハンドルの(排他的な)所有権を取得しないため、foreignQWindow の存続期間中、ネイティブウィンドウを維持するのはアプリケーションの責任となります。
これで、Qt UI をこの外部ウィンドウに埋め込むことも、Qt UI 内で外部ウィンドウをホストすることも可能になります。
Qt を他の UI ツールキットに埋め込む
Qt UI を他の UI ツールキットに埋め込むには、外部ウィンドウを UI の親ウィンドウとして使用します。
埋め込みQt Widgets
Qt Widgets UI を埋め込むには、ウィジェットにそのwindow handle を問い合わせ、それを外部ウィンドウに再親付けします。
QMainWindow *mainWindow = new QMainWindow;
mainWindow->windowHandle()->setParent(foreignWindow);埋め込みQt Quick
Qt Quick UI を埋め込むには、quick ビューの親を直接変更します。
QQuickView *quickView = new QQuickView;
quickView->setParent(foreignWindow);親ハンドルがない場合
場合によっては、ネイティブの親ハンドルにアクセスできず、代わりに、制御の及ばない場所で再親付けされるネイティブハンドルを生成するよう求められることがあります。
親のないQWindow は通常、最上位のウィンドウであるため、まずQt::SubWindow フラグを追加して、そのウィンドウが子ウィンドウになることをQtに明示的に伝える必要があります。
quickView->setFlags(quickView->flags() | Qt::SubWindow);WId次に、QWidget またはQQuickView に対して、
QWindow::winId() を通じて、xml-ph-0000@deepl.internal または xml-ph-0001@deepl.internal からその xml-ph-0002@deepl.internal を要求し、親の変更を行うためにこのネイティブハンドルを返します。
return reinterpret_cast<NSView*>(quickView->winId());イベントのディスパッチ
Qt は、イベントやタイマーを定期的に処理できることを前提としているため、Qt UI を別の UI ツールキットに統合する場合でも、QGuiApplication が必要です。一般的なパターンとしては、Qt UI を最初に構築する際にアプリケーションインスタンスを作成し、プラグインのアンロード時など、Qt UI が破棄されたことが判明した時点でそれを削除します。
Qt での他の UI ツールキットのホスティング
Qt内で他のUIツールキットをホストするには、外部のウィンドウをQt WidgetsまたはQt Quick 固有のウィンドウコンテナでラップします。
でのホスティングQt Widgets
Qt Widgets UI スタックに基づいて構築されたアプリケーションの場合、QWidget::createWindowContainer() を使用して、QWindow のQWidget 表現を作成します。これにより、レイアウト内など、他のウィジェットと同様に管理できるようになります。
QWidget *hostedWidget = QWidget::createWindowContainer(foreignWindow);
layout->addWidget(hostedWidget);ホスティング先Qt Quick
Qt Quick UIスタックに基づいて構築されたアプリケーションでは、外部ウィンドウをQQmlApplicationEngineに公開し、WindowContainer アイテムを使用してその外部ウィンドウを管理します。
engine.setInitialProperties({{ "foreignWindow", QVariant::fromValue(foreignWindow) }});ApplicationWindow {
required property QtObject foreignWindow;
WindowContainer {
window: foreignWindow
anchors.centerIn: parent
}
}このユースケースの詳細については、「ウィンドウホスティングの例」を参照してください。
プラットフォーム固有のソリューション
上記のウィンドウの埋め込みおよびホスティングに関する基本的なプリミティブで、ほとんどの場合に対応できるはずですが、Qt では、さらに深い統合が必要な場合のために、プラットフォーム固有のソリューションも提供しています。
Active Qt モジュール
Qt の ActiveX および COM サポートにより、Windows 向けの Qt 開発者は、Qt アプリケーション内で任意の ActiveX サーバーが提供する ActiveX コントロールや COM オブジェクトにアクセスして使用したり、任意の数の Qt オブジェクトやウィジェットを COM オブジェクトや ActiveX コントロールとして、Qt アプリケーションを COM サーバーとして利用可能にしたりすることができます。
詳細については Active Qt を参照してください。
© 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.