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

シグナル

静的パブリックメンバー

QWindow *renderWindowFor(QQuickWindow *win, QPoint *offset = nullptr)

詳細説明

QQuickWindow および と関連する内部レンダー ループは、 シーンをネイティブ ウィンドウにレンダリングします。サードパーティのOpenGL、Vulkan、Metal、またはDirect 3Dレンダラーと統合する場合など、外部レンダリングエンジンが任意の方法で使用できるテクスチャにシーンを取得すると便利な場合があります。このような仕組みは、VRフレームワークと統合する場合にも不可欠です。QQuickRenderControlは、 ()を使用するパフォーマンス的に制限された代替方法とは異なり、ハードウェアアクセラレーションされた方法でこれを可能にします。QQuickView Qt Quick QQuickWindow::grabWindow

QQuickRenderControlを使用する場合、QQuickWindow (画面上に表示されません)はshown (画面上に表示されません)であってはならず、そのためのネイティブ・ウィンドウは存在しません。その代わりに、QQuickWindow インスタンスは、QQuickWindow コンストラクタのオーバーロードを使用して、レンダーコントロールオブジェクトに関連付けられ、QQuickWindow::setRenderTarget() を介して指定されたテクスチャまたはイメージオブジェクトに関連付けられます。Qt Quick シーンを表し、シーン管理とイベント配信メカニズムの大部分を提供するため、QQuickWindow オブジェクトは依然として不可欠です。しかし、ウィンドウ・システムの観点からは、実際のオンスクリーン・ウィンドウとしては機能しません。

グラフィックス・デバイス、コンテキスト、イメージ・オブジェクト、テクスチャ・オブジェクトの管理は、アプリケーション次第である。initialize ()を呼び出す前に、Qt Quick で使用されるデバイスまたはコンテキストを作成する必要があります。テクスチャオブジェクトの作成は後述します。Qt 5.4 では、QOpenGLContext が既存のネイティブコンテキストを採用する機能が導入されました。QQuickRenderControl とともに使用することで、外部のレンダリングエンジンの既存のコンテキストと共有するQOpenGLContext を作成することができます。この新しいQOpenGLContext を使用して、Qt Quick シーンを、他のエンジンのコンテキストからもアクセス可能なテクスチャにレンダリングできます。Vulkan、Metal、Direct 3D では、Qt が提供するデバイスオブジェクトのラッパーがないため、QQuickWindow::setGraphicsDevice ()を使って既存のオブジェクトをそのまま渡すことができます。

QML コンポーネントのロードとインスタンス化は、QQmlEngine を使って行います。ルートオブジェクトが作成されたら、QQuickWindow の contentItem() の親オブジェクトにする必要があります。

アプリケーションは通常、4つの重要なシグナルに接続する必要があります:

イベント、たとえばマウスやキーボード・イベントをシーンに送信するには、QQuickWindow インスタンスをレシーバーとしてQCoreApplication::sendEvent() を使用する。

キーイベントの場合は、目的のアイテムに手動でフォーカスを設定する必要があります。実際には、シーン(QQuickWindow )に関連付けされたアイテム(例えばシーンのルートアイテム)に対して、forceActiveFocus ()を呼び出します。

注意: 一般的に、QQuickRenderControlは、すべてのQt Quick バックエンドとの組み合わせでサポートされています。しかし、いくつかの機能、特にgrab()は、すべてのケースで利用できるとは限りません。

メンバー関数ドキュメント

[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 Quicksoftware アダプテーションを使用する際には呼び出す必要はなく、また呼び出す必要もありません。

:内部的には、beginFrame() およびendFrame() は、それぞれbeginOffscreenFrame() およびendOffscreenFrame() を呼び出します。これは、この関数が呼び出されたときに、QRhi に記録されているフレーム(オフスクリーンでもスワップチェインベースでも)が存在してはならないことを意味します。

この関数は Qt 6.0 で導入されました。

endFrame()、initialize()、sync()、render()、QQuickGraphicsDeviceQQuickRenderTargetも参照してください

[since 6.6] QRhiCommandBuffer *QQuickRenderControl::commandBuffer() const

現在のコマンド・バッファを返す。

beginFrame() が呼び出されると、QRhiCommandBuffer が自動的にセットアップされます。これは、Qt Quick scenegraph が使用するコマンド・バッファですが、アプリケーションによっては、リソースの更新(例えば、テクスチャのリードバック)を発行するために、このコマンド・バッファを照会したい場合もあります。

返されたコマンド・バッファ・リファレンスは、beginFrame() とendFrame() の間でのみ使用されるべきです。例えば、endFrame ()の直後で、次のbeginFrame ()の前にコマンドバッファ上でlastCompletedGpuTime ()を呼び出すことは有効です。

注意: この関数は、Qt Quicksoftware 変換を使用する場合には適用できず、NULL を返します。

この関数は Qt 6.6 で導入されました。

rhi(),beginFrame(),endFrame()も参照してください

[since 6.0] void QQuickRenderControl::endFrame()

グラフィックス・フレームの終了を指定します。sync() またはrender() の呼び出しは、beginFrame() および endFrame() の呼び出しで囲む必要があります。

この関数が呼び出されると、scenegraph によってキューに入れられたグラフィックス・コマンドは、コンテキストまたはコマンド・キューのいずれか適用可能な方に提出されます。

注: この関数は、Qt Quicksoftware 適応を使用するときには呼び出される必要はなく、呼び出される必要もありません。

この関数は Qt 6.0 で導入されました。

beginFrame()、initialize()、sync()、render()、QQuickGraphicsDeviceQQuickRenderTargetも参照してください

[since 6.0] bool QQuickRenderControl::initialize()

シーングラフリソースを初期化する。Vulkan、Metal、OpenGL、Direct3D などのグラフィックス API をQt Quick レンダリングに使用する場合、この関数が呼び出されるとQQuickRenderControl が適切なレンダリングエンジンをセットアップします。このレンダリング インフラストラクチャは、QQuickRenderControl が存在する限り存在する。

Qt Quick が使用するグラフィック API を制御するには、QSGRendererInterface:GraphicsApi 定数のいずれかを指定してQQuickWindow::setGraphicsApi() を呼び出します。これは、この関数を呼び出す前に行う必要があります。

シーングラフが独自のデバイスとコンテキスト・オブジェクトを作成しないようにするには、QQuickWindow::setGraphicsDevice() を呼び出して、既存のグラフィック・オブジェクトをラップする、適切なQQuickGraphicsDevice を指定します。

どのデバイス拡張を有効にするかを設定するには(たとえば、Vulkan の場合)、この関数の前にQQuickWindow::setGraphicsConfiguration() を呼び出します。

注: Vulkan を使用する場合、QQuickRenderControl は自動的にQVulkanInstance を作成しません。むしろ、QQuickWindow で適切なQVulkanInstanceassociate it を作成するのはアプリケーションの責任です。QVulkanInstance を初期化する前に、静的関数QQuickGraphicsConfiguration::preferredInstanceExtensions() を呼び出してQt Quick の希望するインスタンス拡張のリストを照会し、返されたリストをQVulkanInstance::setExtensions() に渡すことを強く推奨します。

成功した場合はtrue を返し、そうでない場合はfalse を返す。

注意: Qt Quicksoftware 適応を使用する場合、この関数を呼び出す必要はなく、また呼び出 す必要もない。

デフォルトの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 Quicksoftware 適応を使用する場合には適用できず、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() が真を返した場合、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 で導入されました。

© 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.