QQuickRenderControl Class
QQuickRenderControl クラスは、Qt Quick のシーングラフを、アプリケーションが完全に制御する形でオフスクリーンのレンダリングターゲット上にレンダリングするための仕組みを提供します。詳細...
| ヘッダー: | #include <QQuickRenderControl> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Quick) target_link_libraries(mytarget PRIVATE Qt6::Quick) |
| qmake: | QT += quick |
| 継承元: | QObject |
パブリック関数
| QQuickRenderControl(QObject *parent = nullptr) | |
| virtual | ~QQuickRenderControl() override |
(since 6.0) void | beginFrame() |
(since 6.6) QRhiCommandBuffer * | commandBuffer() const |
(since 6.0) void | endFrame() |
(since 6.0) bool | initialize() |
| void | invalidate() |
| void | polishItems() |
| void | prepareThread(QThread *targetThread) |
| void | render() |
| virtual QWindow * | renderWindow(QPoint *offset) |
(since 6.6) QRhi * | rhi() const |
(since 6.0) int | samples() const |
(since 6.0) void | setSamples(int sampleCount) |
| bool | sync() |
(since 6.0) QQuickWindow * | window() const |
シグナル
| void | renderRequested() |
| void | sceneChanged() |
静的パブリックメンバー
| QWindow * | renderWindowFor(QQuickWindow *win, QPoint *offset = nullptr) |
詳細な説明
QQuickWindow および `QQuickView `、ならびにそれらに関連する内部レンダリングループは、Qt Quick のシーンをネイティブウィンドウ上にレンダリングします。例えば、サードパーティ製のOpenGL、Vulkan、Metal、またはDirect 3Dレンダラーと統合する場合など、シーンをテクスチャに取り込み、外部のレンダリングエンジンで任意の方法で利用できるようにすることが有用な場合があります。 このような仕組みは、VRフレームワークと統合する際にも不可欠です。QQuickRenderControlを使用すれば、パフォーマンス面で制限のあるQQuickWindow::grabWindow()を使用する代替手段とは異なり、ハードウェアアクセラレーションを活用した方法でこれを実現できます。
QQuickRenderControlを使用する場合、QQuickWindow はshown であってはなりません(画面上に表示されなくなります)。また、それに基づくネイティブウィンドウも存在しません。その代わりに、QQuickWindow コンストラクタのオーバーロードを使用し、QQuickWindow::setRenderTarget()で指定されたテクスチャまたは画像オブジェクトを通じて、QQuickWindow インスタンスがレンダリングコントロールオブジェクトに関連付けられます。QQuickWindow オブジェクトは、Qt Quick シーンを表し、シーン管理やイベント配信メカニズムの大部分を提供するため、依然として不可欠です。ただし、ウィンドウシステムの観点からは、実際の画面上のウィンドウとして機能するわけではありません。
グラフィックデバイス、コンテキスト、画像オブジェクト、テクスチャオブジェクトの管理は、アプリケーションに委ねられています。Qt Quick が使用するデバイスまたはコンテキストは、initialize()を呼び出す前に作成しておく必要があります。テクスチャオブジェクトの作成は後回しにすることも可能です(詳細は後述)。 Qt 5.4では、QOpenGLContext が既存のネイティブコンテキストを採用する機能が導入されました。これとQQuickRenderControlを組み合わせることで、外部レンダリングエンジンの既存コンテキストを共有するQOpenGLContext を作成することが可能になります。この新しいQOpenGLContext を使用すると、Qt Quick のシーンを、他のエンジンのコンテキストからもアクセス可能なテクスチャとしてレンダリングすることができます。 Vulkan、Metal、およびDirect 3Dについては、Qtが提供するデバイスオブジェクト用のラッパーは存在しないため、既存のものをQQuickWindow::setGraphicsDevice()を介してそのまま渡すことができます。
QMLコンポーネントの読み込みとインスタンス化は、QQmlEngine を使用して行われます。ルートオブジェクトが作成されたら、それをQQuickWindow のcontentItem()に親として設定する必要があります。
アプリケーションでは通常、以下の4つの重要なシグナルに接続する必要があります。
- QQuickWindow::sceneGraphInitialized() `QQuickRenderControl::initialize()`の呼び出し後、ある時点で発火します。このシグナルを受け取ると、アプリケーションはフレームバッファオブジェクトを作成し、それを`QQuickWindow`に関連付けることが期待されます。
- QQuickWindow::sceneGraphInvalidated() シーングラフのリソースが解放されると、フレームバッファオブジェクトも破棄されます。
- QQuickRenderControl::renderRequested()render() を呼び出してシーンをレンダリングする必要があることを示します。コンテキストを現在のものにした後、アプリケーションはrender() を呼び出す必要があります。
- QQuickRenderControl::sceneChanged() シーンが変更されたことを示します。つまり、レンダリングの前に、ポリッシングと同期も必要になります。
マウスやキーボードのイベントなどのイベントをシーンに送信するには、QQuickWindow インスタンスを受信者としてQCoreApplication::sendEvent() を使用します。
キーイベントの場合は、目的のアイテムに手動でフォーカスを設定する必要がある場合もあります。実際には、目的のアイテム(たとえば、シーンのルートアイテム)がシーン(QQuickWindow )に関連付けられたら、そのアイテムに対してforceActiveFocus() を呼び出します。
メンバ関数のドキュメント
[explicit] QQuickRenderControl::QQuickRenderControl(QObject *parent = nullptr)
親オブジェクトがparent であるQQuickRenderControlオブジェクトを作成します。
[override virtual noexcept] QQuickRenderControl::~QQuickRenderControl()
インスタンスを破棄します。すべてのシーングラフリソースを解放します。
invalidate()も参照してください 。
[since 6.0] void QQuickRenderControl::beginFrame()
グラフィックフレームの開始を指定します。sync() またはrender() の呼び出しは、beginFrame() およびendFrame() の呼び出しで囲まれている必要があります。
Qt 5の初期段階のようにOpenGLのみに限定されていた環境とは異なり、他のグラフィックスAPIを使用したレンダリングでは、フレームの開始点と終了点をより明確に定義する必要があります。QQuickRenderControl を使用してレンダリングループを手動で制御する場合、これらの点を指定するのはQQuickRenderControl のユーザーの責任となります。
既存のテクスチャへのレンダリングの初期化を含む、典型的な更新ステップは以下のようになります。このサンプルコードは Direct3D 11 を想定していますが、同じ概念は他のグラフィックス API にも適用されます。
if(!m_quickInitialized) {
m_quickWindow->setGraphicsDevice(QQuickGraphicsDevice::fromDeviceAndContext(m_engine->device(), m_engine->context()));
if(!m_renderControl->initialize())
qWarning("Failed to initialize redirected Qt Quick rendering");
m_quickWindow->setRenderTarget(QQuickRenderTarget::fromNativeTexture({ quint64(m_res.texture), 0},
QSize(QML_WIDTH,QML_HEIGHT),
SAMPLE_COUNT));
m_quickInitialized= true;
}
m_renderControl->polishItems();
m_renderControl->beginFrame();
m_renderControl->sync();
m_renderControl->render();
m_renderControl->endFrame();//Qt Quick のレンダリングコマンドはここでデバイスコンテキストに送信されます注: Qt Quick のsoftware 版を使用する場合は、この関数を呼び出す必要はなく 、また呼び出してはなりません。
注:内部的には 、beginFrame() とendFrame() は、それぞれbeginOffscreenFrame() とendOffscreenFrame() を呼び出します。これは、この関数が呼び出される際、QRhi 上で(オフスクリーンでもスワップチェーンベースでも)フレームが記録されていてはならないことを意味します。
この関数は Qt 6.0 で導入されました。
関連項目: endFrame()、initialize()、sync()、render()、QQuickGraphicsDevice 、およびQQuickRenderTarget 。
[since 6.6] QRhiCommandBuffer *QQuickRenderControl::commandBuffer() const
現在のコマンドバッファを返します。
beginFrame() が呼び出されると、QRhiCommandBuffer が自動的に設定されます。これは、Qt Quick シーングラフが使用するコマンドバッファですが、場合によっては、アプリケーション側でも(例えば、リソースの更新(テクスチャの読み込みなど)を実行するために)これを照会したい場合があります。
返されるコマンドバッファの参照は、beginFrame() とendFrame() の間でのみ使用すべきです。ただし、特定の例外があります。例えば、endFrame() の直後、かつ次のbeginFrame() よりも前に、そのコマンドバッファに対してlastCompletedGpuTime() を呼び出すことは有効です。
注:この関数は 、Qt Quick のsoftware 対応版を使用している場合には適用されず、nullを返します。
この関数は Qt 6.6 で導入されました。
関連項目: rhi()、beginFrame()、およびendFrame()。
[since 6.0] void QQuickRenderControl::endFrame()
グラフィックスフレームの終了を指定します。sync() またはrender() の呼び出しは、beginFrame() および endFrame() の呼び出しで囲まれている必要があります。
この関数が呼び出されると、シーングラフによってキューに入れられたグラフィックスコマンドは、該当する方(コンテキストまたはコマンドキュー)に送信されます。
注: Qt Quick のsoftware アダプテーションを使用する場合、この関数を呼び出す必要はなく 、また呼び出してはなりません。
この関数は Qt 6.0 で導入されました。
関連項目: beginFrame()、initialize()、sync()、render()、QQuickGraphicsDevice 、およびQQuickRenderTarget 。
[since 6.0] bool QQuickRenderControl::initialize()
シーングラフのリソースを初期化します。Vulkan、Metal、OpenGL、Direct3D などのグラフィックス API を `Qt Quick ` のレンダリングに使用する際、この関数が呼び出されると、QQuickRenderControl が適切なレンダリングエンジンを設定します。このレンダリングインフラストラクチャは、QQuickRenderControl が存在する限り維持されます。
Qt Quick が使用するグラフィックスAPIを制御するには、QQuickWindow::setGraphicsApi() を、QSGRendererInterface:GraphicsApi 定数のいずれかを引数として呼び出します。これは、本関数を呼び出す前に実行する必要があります。
シーングラフが独自のデバイスおよびコンテキストオブジェクトを作成しないようにするには、QQuickWindow::setGraphicsDevice() を呼び出し、既存のグラフィックスオブジェクトをラップした適切なQQuickGraphicsDevice を指定してください。
有効にするデバイス拡張機能(Vulkanなど)を設定するには、この関数を呼び出す前にQQuickWindow::setGraphicsConfiguration()を呼び出してください。
注: Vulkanを使用する場合 、QQuickRenderControl はQVulkanInstance を自動的に作成しません。代わりに、QQuickWindow を使用して適切なQVulkanInstance およびassociate it を作成するのは、アプリケーションの責任となります。QVulkanInstance を初期化する前に、静的関数QQuickGraphicsConfiguration::preferredInstanceExtensions() を呼び出してQt Quick が求めるインスタンス拡張機能のリストを照会し、返されたリストをQVulkanInstance::setExtensions() に渡すことを強く推奨します。
成功した場合はtrue を返し、それ以外の場合はfalse を返します。
注: Qt Quick のsoftware 適応版を使用する場合は、この関数を呼び出す必要はなく 、また呼び出してはなりません。
デフォルトのQt Quick 適応では、この関数は新しいQRhi オブジェクトを作成します。これは、QQuickRenderControl が使用されなかった場合の画面上のQQuickWindow と同様です。この新しいQRhi オブジェクトに、既存のデバイスまたはコンテキストリソースを採用させるには(たとえば、新しいQOpenGLContext を作成する代わりに既存のものを使用する場合など)、前述のようにQQuickWindow::setGraphicsDevice() を使用します。 アプリケーションが、Qt Quick のレンダリングに既存のQRhi オブジェクトを使用したい場合、QQuickGraphicsDevice::fromRhi() を通じてこれも可能です。既存のQRhi を参照するQQuickGraphicsDevice が設定されている場合、initialize() 内で新しい専用のQRhi オブジェクトは作成されません。
この関数は Qt 6.0 で導入されました。
QQuickRenderTarget 、QQuickGraphicsDevice 、およびQQuickGraphicsConfiguration::preferredInstanceExtensions()も参照してください 。
void QQuickRenderControl::invalidate()
レンダリングを停止し、リソースを解放します。
これは、ウィンドウが非表示になった際に実際のQQuickWindow で行われるクリーンアップ処理に相当します。
この関数はデストラクタから呼び出されます。したがって、通常は直接呼び出す必要はありません。
invalidate() が呼び出されると、initialize() を再度呼び出すことで、QQuickRenderControl インスタンスを再利用することが可能になります。
注:この関数は、 QQuickWindow::persistentSceneGraph() や QQuickWindow::persistentGraphics() を考慮しません。つまり、コンテキスト固有のリソースは常に解放されます。
void QQuickRenderControl::polishItems()
この関数は、sync() が実行される直前になるまで、できるだけ遅く呼び出す必要があります。スレッド環境では、この関数の実行とレンダリングが並行して行われる場合があります。
void QQuickRenderControl::prepareThread(QThread *targetThread)
GUIスレッド外でQt Quick シーンのレンダリングを準備します。
targetThread 同期処理およびレンダリングが行われるスレッドを指定します。シングルスレッド環境では、この関数を呼び出す必要はありません。
void QQuickRenderControl::render()
現在のコンテキストを使用して、シーングラフを描画します。
[signal] void QQuickRenderControl::renderRequested()
このシグナルは、シーングラフをレンダリングする必要があるときに発火します。sync() を呼び出す必要はありません。
注: このシグナルが発火した際に、直接レンダリングを実行することは避けてください 。代わりに、例えばタイマーを使用するなどして、レンダリングを遅延させることを推奨します。これにより、パフォーマンスが向上します。
[virtual] QWindow *QQuickRenderControl::renderWindow(QPoint *offset)
このレンダリングコントロールが実際に描画を行っているウィンドウを返すよう、サブクラスで再実装されます。
offset がnullでない場合、ウィンドウ内でのコントロールのオフセットに設定されます。
注: 必須ではありませんが 、異なるデバイスピクセル比を持つ複数の画面をサポートし、QMLから開かれたポップアップウィンドウを適切に配置するためには、この関数を再実装することが不可欠となります。したがって、サブクラスでこの関数を実装することを強く推奨します。
[static] QWindow *QQuickRenderControl::renderWindowFor(QQuickWindow *win, QPoint *offset = nullptr)
win がレンダリングされている実際のウィンドウ(存在する場合)を返します。
offset が null 以外の場合、そのウィンドウ内でのレンダリングのオフセットが設定されます。
[since 6.6] QRhi *QQuickRenderControl::rhi() const
この `QQuickRenderControl ` に関連付けられている `QRhi ` を返します。
注: QRhi は 、initialize() が正常に完了した場合にのみ存在します。それ以前は、戻り値は null になります。
注: Qt Quick のsoftware アダプテーションを使用する場合、この関数は 適用されず、nullを返します。
この関数は Qt 6.6 で導入されました。
関連項目: commandBuffer()、beginFrame()、およびendFrame()。
[since 6.0] int QQuickRenderControl::samples() const
現在のサンプル数を返します。1 または 0 は、マルチサンプリングが行われていないことを意味します。
この関数は Qt 6.0 で導入されました。
setSamples()も参照してください 。
[signal] void QQuickRenderControl::sceneChanged()
このシグナルは、シーングラフが更新されたときに発火します。つまり、polishItems() およびsync() を呼び出す必要があります。sync() が true を返した場合、render() を呼び出す必要があります。
注: このシグナルが発火した際に、ポリッシング、同期処理、レンダリングを直接実行することは避けてください 。代わりに、例えばタイマーを使用するなどして、それらの処理を遅延させることを推奨します。これにより、パフォーマンスが向上します。
[since 6.0] void QQuickRenderControl::setSamples(int sampleCount)
マルチサンプリングに使用するサンプル数を設定します。sampleCount が 0 または 1 の場合、マルチサンプリングは無効になります。
注:この関数は常に マルチサンプル・レンダリングターゲットと組み合わせて使用されます。つまり、sampleCount はQQuickRenderTarget::fromNativeTexture()に渡されるサンプル数と一致している必要があり、そのサンプル数はネイティブテクスチャのサンプル数と一致している必要があります。
この関数は Qt 6.0 で導入されました。
関連項目: samples()、initialize()、およびQQuickRenderTarget 。
bool QQuickRenderControl::sync()
この関数は、QMLシーンとレンダリングシーングラフを同期させるために使用されます。
専用のレンダリングスレッドが使用されている場合、この呼び出しが行われている間はGUIスレッドをブロックする必要があります。
同期処理によってシーングラフが変更された場合、true を返します。
[since 6.0] QQuickWindow *QQuickRenderControl::window() const
このQQuickRenderControl に関連付けられているQQuickWindow を返します。
注: QQuickRenderControl は 、QQuickWindow の生成時にQQuickWindow に関連付けられます。それ以前の時点では、この関数の戻り値はnullとなります。
この関数は Qt 6.0 で導入されました。
© 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.