QQuickRenderControl Class

QQuickRenderControl クラスは、Qt Quick のシーングラフをオフスクリーンのレンダーターゲットにレンダリングするメカニズムを提供します。詳細...

Header: #include <QQuickRenderControl>
CMake: find_package(Qt6 REQUIRED COMPONENTS Quick)
target_link_libraries(mytarget PRIVATE Qt6::Quick)
qmake: QT += quick
Inherits: 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 および と関連する内部レンダリングループは、Qt Quick シーンをネイティブウィンドウにレンダリングします。サードパーティの OpenGL、Vulkan、Metal、または Direct 3D レンダラと統合する場合など、シーンをテクスチャに変換して、外部のレンダリングエンジンが任意の方法で使用できるようにすると便利な場合があります。このような仕組みは、VRフレームワークと統合する場合にも不可欠です。QQuickRenderControlは、 ()を使用するパフォーマンス的に制限された代替方法とは異なり、ハードウェアアクセラレーションされた方法でこれを可能にします。QQuickView QQuickWindow::grabWindow

QQuickRenderControlを使用する場合、QQuickWindow (画面上に表示されません)はshown (画面上に表示されません)であってはならず、そのためのネイティブ・ウィンドウは存在しません。その代わりに、QQuickWindow インスタンスは、QQuickWindow コンストラクタのオーバーロードを使用して、レンダーコントロールオブジェクトと関連付けられ、QQuickWindow::setRenderTarget() で指定されたテクスチャまたはイメージオブジェクトが使用されます。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 インスタンスをレシーバーとしてQCoreApplication::sendEvent() を使用する。

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

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

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

[explicit] QQuickRenderControl::QQuickRenderControl(QObject *parent = nullptr)

親オブジェクトparent を持つ QQuickRenderControl オブジェクトを構築します。

[override virtual noexcept] QQuickRenderControl::~QQuickRenderControl()

インスタンスを破棄します。すべての scenegraph リソースを解放します。

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's rendering commands are submitted to the device context here

注意: 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 scenegraph が使用するコマンド・バッファですが、アプリケーションによっては、リソースの更新(例えば、テクスチャのリードバックなど)を発行するために、このコマンド・バッファに問い合わせたい場合もあります。

返されたコマンド・バッファ・リファレンスは、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() の呼び出しで囲む必要があります。

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

注意: この関数は、Qt Quick のsoftware を使用しているときには呼び出す必要はありません。

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

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

[since 6.0] bool QQuickRenderControl::initialize()

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

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

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

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

注: Vulkan を使用する場合、QQuickRenderControl は自動的にQVulkanInstance を作成しません。QVulkanInstance associate it QQuickWindow QVulkanInstance を初期化する前に、スタティック関数 () を呼び出して Qt Quick の希望するインスタンス拡張のリストをクエリし、返されたリストを () に渡すことを強く推奨します。QQuickGraphicsConfiguration::preferredInstanceExtensions 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 で導入されました。

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