プラットフォームの統合

アプリケーション開発のためのクロスプラットフォームツールキットとしてのQtの主な強みは、ターゲットプラットフォームごとにアプリケーションコードを複製する必要性を排除することです。

Qtはアプリケーションを書く際の典型的なタスクの多くを解決してくれますが、Qtではカバーできないコーナーケースや、プラットフォーム固有のAPIや他のツールキットの上に機能を構築した方が理にかなっているケースも常に存在します。

このようなユースケースをサポートしつつ、アプリケーションロジックの大部分を Qt で処理できるようにするために、Qt は単純な型変換からプラットフォーム固有のネイティブインターフェースまで、幅広いプラットフォーム統合 API を提供しています。

型変換

Qt の基本的なデータ型の多く(QStringQPointQImage など)は、ネイティブの等価な型との変換を提供します。

例えば、Appleプラットフォームで現在のユーザーのユーザー名を取得する場合などです:

NSProcessInfo *processInfo = NSProcessInfo.processInfo;
QString userName = QString::fromNSString(processInfo.userName)

すべての型変換の完全なリストについては、型変換の概要を参照してください。

ウィンドウの埋め込み

基礎となるプラットフォーム API によって作成されたウィンドウは、Qt ウィンドウの親コンテナとして使用することも、子ウィンドウとして Qt ウィンドウに埋め込むこともできます。

前者は、アプリケーションが主にネイティブのプラットフォーム API を使用して書かれている場合に便利ですが、特殊な UI を描画するためなど、アプリケーションの一部に Qt を使用する場合に便利です。Qtをネイティブアプリケーションのウィンドウ階層に組み込むには、QWindow::winId ()を使用してQtウィンドウのネイティブハンドルを取得し、ネイティブAPIを使用してウィンドウをネイティブUIに再ペアレントします。

後者は、ネイティブプラットフォームや他のツールキットが、特殊なコントロールをネイティブウィンドウとして公開している場合に便利です。QWindow::fromWinId() を使用してネイティブ・ウィンドウ・ハンドルをQWindow でラップすることで、ウィンドウを他のQWindow と同様に Qt ウィンドウ階層に再ペアレントすることができます。このQWindow を Qt ウィジェットベースの UI に再ペアレントするには、ウィジェット固有のQWidget::createWindowContainer() 関数を使用します。

イベント処理

Qt でのイベント処理のほとんどの用途は、QWindow::event() やその友人、QObject::installEventFilter() を介したクロスプラットフォームのイベント配信で十分にカバーできます。

これが十分でない場合、Qt はネイティブイベントの配信へのアクセスを提供します。すべてのネイティブイベントを受信するグローバルイベントフィルタはQCoreApplication::installNativeEventFilter() でインストールでき、ウィンドウごとのネイティブイベントはQWindow::nativeEvent() で処理できます。

注意: ネイティブイベントフローに干渉すると、Qt が矛盾した状態になる可能性があります。これらのAPIは、Qtがまだ扱っていないイベントなど、Qtの既存のイベント処理を補強するために使用します。

ネイティブインターフェース

上記のAPIでカバーされていないプラットフォーム固有の機能は、Qtのより汎用的なネイティブインターフェイス機構によって処理されます。インターフェースは、拡張するクラスのネイティブ API やプラットフォーム固有の API へのアクセスを提供します。

インターフェースはQNativeInterface ネームスペースに存在し、基盤となるネイティブ・ハンドルへのアクセス、既存のネイティブ・ハンドルの採用、プラットフォーム固有の API の提供などのユースケースをカバーします。

例えば、QNativeInterface::QCocoaGLContext ネイティブ・インターフェースを介して、macOS 上のQOpenGLContext の基礎となる NSOpenGLContext にアクセスします:

using namespace QNativeInterface;
if (auto *cocoaGLContext = glContext->nativeInterface<QCocoaGLContext>())
    [cocoaGLContext->nativeContext() makeCurrentContext];

すべてのネイティブ・インターフェースの完全なリストは、ネイティブ・インターフェースの概要を参照してください。

警告 つまり、これらのインターフェイスを使用するアプリケーションは、そのアプリケーションが開発された Qt のバージョンでのみ動作することが保証されています。

プラットフォームサポート

アプリケーション開発者向けの API に加えて、Qt ではクロスプラットフォームなビルディングブロックの実装を提供する際にもプラットフォームとのインタフェースを提供します。

例えば、Qt Coreのイベントディスパッチャの抽象化や、RHI のレンダリングハードウェアの抽象化です。

ここでの主な抽象化レイヤーはQt Platform Abstraction、略して QPA で、ウィンドウ システムの統合と関連するユースケースを扱います。

本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。