QQuickRenderControl Class
Die Klasse „QQuickRenderControl“ bietet einen Mechanismus, mit dem die Szenengraph-Struktur von „ Qt Quick “ vollständig anwendungsgesteuert auf ein Offscreen-Renderziel gerendert werden kann. Mehr...
| Header: | #include <QQuickRenderControl> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Quick) target_link_libraries(mytarget PRIVATE Qt6::Quick) |
| qmake: | QT += quick |
| Erbt von: | QObject |
Öffentliche Funktionen
| 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 |
Signale
| void | renderRequested() |
| void | sceneChanged() |
Statische öffentliche Mitglieder
| QWindow * | renderWindowFor(QQuickWindow *win, QPoint *offset = nullptr) |
Ausführliche Beschreibung
QQuickWindow sowie „ QQuickView “ und die dazugehörigen internen Render-Schleifen rendern die „ Qt Quick “-Szene in ein natives Fenster. In manchen Fällen, beispielsweise bei der Integration mit OpenGL-, Vulkan-, Metal- oder Direct 3D-Renderern von Drittanbietern, kann es sinnvoll sein, die Szene in eine Textur zu übertragen, die dann von der externen Rendering-Engine beliebig genutzt werden kann. Ein solcher Mechanismus ist auch bei der Integration in ein VR-Framework unerlässlich. QQuickRenderControl ermöglicht dies auf hardwarebeschleunigte Weise, im Gegensatz zur leistungsmäßig eingeschränkten Alternative, die Verwendung von ` QQuickWindow::grabWindow()`
Bei der Verwendung eines `QQuickRenderControl` darf das ` QQuickWindow ` nicht auf ` shown ` gesetzt sein (es wäre sonst auf dem Bildschirm nicht sichtbar) und es gibt kein zugrunde liegendes natives Fenster dafür. Stattdessen wird die ` QQuickWindow `-Instanz mithilfe der Überladung des Konstruktors ` QQuickWindow ` und eines über ` QQuickWindow::setRenderTarget()` angegebenen Textur- oder Bildobjekts mit dem Render-Control-Objekt verknüpft. Das „ QQuickWindow “-Objekt ist nach wie vor unverzichtbar, da es die „ Qt Quick “-Szene repräsentiert und den Großteil der Mechanismen zur Szenenverwaltung und Ereignisübermittlung bereitstellt. Aus Sicht des Fenstersystems fungiert es jedoch nicht als echtes Bildschirmfenster.
Die Verwaltung der Grafikgeräte, Kontexte sowie Bild- und Texturobjekte obliegt der Anwendung. Das von „ Qt Quick “ verwendete Gerät oder der Kontext muss vor dem Aufruf von „ initialize()“ erstellt werden. Die Erstellung des Texturobjekts kann aufgeschoben werden, siehe unten. Qt 5.4 führt die Möglichkeit ein, dass „ QOpenGLContext “ vorhandene native Kontexte übernehmen kann. Zusammen mit „QQuickRenderControl“ ermöglicht dies die Erstellung eines „ QOpenGLContext “, das den vorhandenen Kontext einer externen Rendering-Engine gemeinsam nutzt. Dieses neue „ QOpenGLContext “ kann dann verwendet werden, um die „ Qt Quick “-Szene in eine Textur zu rendern, auf die auch der Kontext der anderen Engine zugreifen kann. Für Vulkan, Metal und Direct 3D gibt es keine von Qt bereitgestellten Wrapper für Geräteobjekte, sodass vorhandene Objekte unverändert über ` QQuickWindow::setGraphicsDevice()` übergeben werden können.
Das Laden und Instanziieren der QML-Komponenten erfolgt mithilfe von ` QQmlEngine`. Sobald das Root-Objekt erstellt ist, muss es dem `contentItem()` von ` QQuickWindow` untergeordnet werden.
Anwendungen müssen in der Regel vier wichtige Signale abhören:
- QQuickWindow::sceneGraphInitialized() Wird zu einem bestimmten Zeitpunkt nach dem Aufruf von QQuickRenderControl::initialize() ausgelöst. Bei diesem Signal wird erwartet, dass die Anwendung ihr Framebuffer-Objekt erstellt und es mit dem QQuickWindow verknüpft.
- QQuickWindow::sceneGraphInvalidated() Wenn die Scenegraph-Ressourcen freigegeben werden, kann auch das Framebuffer-Objekt zerstört werden.
- QQuickRenderControl::renderRequested() Zeigt an, dass die Szene durch den Aufruf von ` render()` gerendert werden muss. Nachdem der Kontext als aktuell gesetzt wurde, wird von Anwendungen erwartet, dass sie ` render()` aufrufen.
- QQuickRenderControl::sceneChanged() Zeigt an, dass sich die Szene geändert hat, was bedeutet, dass vor dem Rendern auch eine Nachbearbeitung und Synchronisierung erforderlich sind.
Um Ereignisse, beispielsweise Maus- oder Tastaturereignisse, an die Szene zu senden, verwenden Sie ` QCoreApplication::sendEvent()` mit der ` QQuickWindow `-Instanz als Empfänger.
Bei Tastenereignissen kann es außerdem erforderlich sein, den Fokus manuell auf das gewünschte Element zu setzen. In der Praxis bedeutet dies, dass ` forceActiveFocus()` auf das gewünschte Element – beispielsweise das Stammelement der Szene – aufgerufen wird, sobald dieses der Szene (der ` QQuickWindow`) zugeordnet ist.
Dokumentation der Member-Funktionen
[explicit] QQuickRenderControl::QQuickRenderControl(QObject *parent = nullptr)
Erstellt ein `QQuickRenderControl`-Objekt, dessen übergeordnetes Objekt ` parent` ist.
[override virtual noexcept] QQuickRenderControl::~QQuickRenderControl()
Löscht die Instanz. Gibt alle Ressourcen des Szenengraphen frei.
Siehe auch ` invalidate()`.
[since 6.0] void QQuickRenderControl::beginFrame()
Legt den Beginn eines Grafikframes fest. Aufrufe von „ sync()“ oder „ render()“ müssen zwischen Aufrufen von „beginFrame()“ und „ endFrame()“ stehen.
Im Gegensatz zur früheren, ausschließlich auf OpenGL basierenden Welt von Qt 5 erfordert das Rendern mit anderen Grafik-APIs klar definierte Start- und Endpunkte eines Frames. Bei manueller Steuerung der Render-Schleife über ` QQuickRenderControl` obliegt es nun dem Benutzer von ` QQuickRenderControl `, diese Punkte festzulegen.
Ein typischer Aktualisierungsschritt, einschließlich der Initialisierung des Renderings in eine vorhandene Textur, könnte wie folgt aussehen. Der Beispielcode geht von Direct3D 11 aus, doch die gleichen Konzepte gelten auch für andere Grafik-APIs.
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(); // Die Rendering-Befehle von „ Qt Quick “ werden hier an den Gerätekontext übermittelt:Hinweis: Diese Funktion muss bei Verwendung der software -Anpassung von Qt Quick nicht und darf nicht aufgerufen werden.
Hinweis: Intern rufen `beginFrame()` und ` endFrame()` jeweils ` beginOffscreenFrame()` bzw. ` endOffscreenFrame()` auf. Dies bedeutet, dass zum Zeitpunkt des Aufrufs dieser Funktion kein Frame (weder Offscreen noch Swapchain-basiert) auf dem „ QRhi “ aufgezeichnet werden darf.
Diese Funktion wurde in Qt 6.0 eingeführt.
Siehe auch „ endFrame()“, „ initialize()“, „ sync()“, „ render()“, „ QQuickGraphicsDevice “ und „ QQuickRenderTarget “.
[since 6.6] QRhiCommandBuffer *QQuickRenderControl::commandBuffer() const
Gibt den aktuellen Befehlspuffer zurück.
Sobald beginFrame() aufgerufen wird, wird automatisch ein QRhiCommandBuffer eingerichtet. Dies ist der Befehlspuffer Qt Quick, den der Szenegraph verwendet, aber in einigen Fällen möchten Anwendungen diesen möglicherweise auch abfragen, beispielsweise um Ressourcenaktualisierungen durchzuführen (z. B. ein Textur-Readback).
Die zurückgegebene Befehlspuffer-Referenz sollte nur zwischen beginFrame() und endFrame() verwendet werden. Es gibt bestimmte Ausnahmen; so ist beispielsweise der Aufruf von lastCompletedGpuTime() für den Befehlspuffer unmittelbar nach endFrame(), jedoch vor dem nächsten beginFrame(), zulässig.
Hinweis: Diese Funktion ist nicht anwendbar und gibt null zurück, wenn die software -Anpassung von Qt Quick verwendet wird.
Diese Funktion wurde in Qt 6.6 eingeführt.
Siehe auch „ rhi()“, „ beginFrame()“ und „ endFrame()“.
[since 6.0] void QQuickRenderControl::endFrame()
Gibt das Ende eines Grafikframes an. Aufrufe von ` sync()` oder ` render()` müssen von Aufrufen von ` beginFrame()` und `endFrame()` umschlossen sein.
Wenn diese Funktion aufgerufen wird, werden alle vom Szenengrafikbaum in die Warteschlange gestellten Grafikbefehle an den Kontext oder die Befehlswarteschlange übermittelt, je nachdem, was zutrifft.
Hinweis: Diese Funktion muss nicht und darf nicht aufgerufen werden, wenn die software -Anpassung von Qt Quick verwendet wird.
Diese Funktion wurde in Qt 6.0 eingeführt.
Siehe auch beginFrame(), initialize(), sync(), render(), QQuickGraphicsDevice sowie QQuickRenderTarget.
[since 6.0] bool QQuickRenderControl::initialize()
Initialisiert die Ressourcen des Szenengraphen. Bei Verwendung einer Grafik-API wie Vulkan, Metal, OpenGL oder Direct3D für das „ Qt Quick “-Rendering richtet „ QQuickRenderControl “ beim Aufruf dieser Funktion eine entsprechende Rendering-Engine ein. Diese Rendering-Infrastruktur besteht so lange, wie der „ QQuickRenderControl “ existiert.
Um zu steuern, welche Grafik-API „ Qt Quick “ verwendet, rufen Sie „ QQuickWindow::setGraphicsApi()“ mit einer der Konstanten „ QSGRendererInterface:GraphicsApi“ auf. Dies muss vor dem Aufruf dieser Funktion erfolgen.
Um zu verhindern, dass der Szenengrafikbaum eigene Geräte- und Kontext-Objekte erstellt, geben Sie durch den Aufruf von ` QQuickWindow::setGraphicsDevice()` einen geeigneten ` QQuickGraphicsDevice` an, der vorhandene Grafikobjekte umschließt.
Um zu konfigurieren, welche Geräteerweiterungen aktiviert werden sollen (z. B. für Vulkan), rufen Sie vor dieser Funktion QQuickWindow::setGraphicsConfiguration() auf.
Hinweis: Bei Verwendung von Vulkan erstellt „ QQuickRenderControl “ nicht automatisch ein „ QVulkanInstance “. Vielmehr ist es Aufgabe der Anwendung, ein geeignetes „ QVulkanInstance “ und „ associate it “ mit dem „ QQuickWindow “ zu erstellen. Vor der Initialisierung des „ QVulkanInstance “ wird dringend empfohlen, die Liste der gewünschten Instanzerweiterungen von „ Qt Quick “ durch Aufruf der statischen Funktion „ QQuickGraphicsConfiguration::preferredInstanceExtensions()“ abzufragen und die zurückgegebene Liste an „ QVulkanInstance::setExtensions()“ zu übergeben.
Gibt bei Erfolg „ true “ zurück, andernfalls „ false “.
Hinweis: Diese Funktion muss nicht und darf nicht aufgerufen werden, wenn die software -Anpassung von Qt Quick verwendet wird.
Mit der Standardanpassung „ Qt Quick “ erstellt diese Funktion ein neues „ QRhi “-Objekt, ähnlich wie es bei einem Bildschirm-„ QQuickWindow “ der Fall wäre, wenn „ QQuickRenderControl “ nicht verwendet würde. Damit dieses neue „ QRhi “-Objekt eine bereits vorhandene Geräte- oder Kontextressource übernimmt (z. B. ein vorhandenes „ QOpenGLContext “ verwendet, anstatt ein neues zu erstellen), verwenden Sie wie oben erwähnt „ QQuickWindow::setGraphicsDevice()“. Wenn die Anwendung möchte, dass die Darstellung von ` Qt Quick ` ein bereits vorhandenes ` QRhi `-Objekt verwendet, ist dies ebenfalls über ` QQuickGraphicsDevice::fromRhi()` möglich. Wenn ein solches ` QQuickGraphicsDevice`, das auf ein bereits vorhandenes ` QRhi` verweist, festgelegt wird, wird in `initialize()` kein neues, dediziertes ` QRhi `-Objekt erstellt.
Diese Funktion wurde in Qt 6.0 eingeführt.
Siehe auch „ QQuickRenderTarget“ , „ QQuickGraphicsDevice “ und „ QQuickGraphicsConfiguration::preferredInstanceExtensions()“.
void QQuickRenderControl::invalidate()
Das Rendern beenden und Ressourcen freigeben.
Dies entspricht den Aufräumvorgängen, die bei einem echten „ QQuickWindow “ stattfinden, wenn das Fenster ausgeblendet wird.
Diese Funktion wird vom Destruktor aufgerufen. Daher ist es in der Regel nicht erforderlich, sie direkt aufzurufen.
Sobald `invalidate()` aufgerufen wurde, kann die ` QQuickRenderControl `-Instanz durch erneuten Aufruf von ` initialize()` wiederverwendet werden.
Hinweis: Diese Funktion berücksichtigt weder QQuickWindow::persistentSceneGraph() noch QQuickWindow::persistentGraphics(). Das bedeutet, dass kontextspezifische Ressourcen immer freigegeben werden.
void QQuickRenderControl::polishItems()
Diese Funktion sollte so spät wie möglich vor dem Aufruf von ` sync()` aufgerufen werden. In einer Thread-Umgebung kann die Darstellung parallel zu dieser Funktion erfolgen.
void QQuickRenderControl::prepareThread(QThread *targetThread)
Bereitet die Darstellung der „ Qt Quick “-Szene außerhalb des GUI-Threads vor.
targetThread Legt den Thread fest, in dem die Synchronisation und das Rendering stattfinden sollen. In einem Single-Thread-Szenario muss diese Funktion nicht aufgerufen werden.
void QQuickRenderControl::render()
Rendert den Szenengrafen unter Verwendung des aktuellen Kontexts.
[signal] void QQuickRenderControl::renderRequested()
Dieses Signal wird ausgelöst, wenn der Szenenbaum gerendert werden muss. Es ist nicht erforderlich, die Funktion „ sync()“ aufzurufen.
Hinweis: Vermeiden Sie es, das Rendern direkt auszulösen, wenn dieses Signal ausgegeben wird. Zögern Sie es stattdessen lieber auf, indem Sie beispielsweise einen Timer verwenden. Dies führt zu einer besseren Leistung.
[virtual] QWindow *QQuickRenderControl::renderWindow(QPoint *offset)
Wird in Unterklassen neu implementiert, um das tatsächliche Fenster zurückzugeben, in das dieses Render-Steuerelement rendert.
Ist ` offset ` nicht null, wird es auf den Versatz des Steuerelements innerhalb des Fensters gesetzt.
Hinweis: Die Neuimplementierung dieser Funktion istzwar nicht zwingend erforderlich, wirdjedoch unerlässlich, um mehrere Bildschirme mit unterschiedlichen Gerätepixelverhältnissen zu unterstützen und aus QML geöffnete Popup-Fenster korrekt zu positionieren. Daher wird dringend empfohlen, sie in Unterklassen bereitzustellen.
[static] QWindow *QQuickRenderControl::renderWindowFor(QQuickWindow *win, QPoint *offset = nullptr)
Gibt das eigentliche Fenster zurück, in dem „ win “ gerendert wird, sofern vorhanden.
Ist „ offset “ nicht null, wird es auf den Offset der Darstellung innerhalb seines Fensters gesetzt.
[since 6.6] QRhi *QQuickRenderControl::rhi() const
Gibt die „ QRhi “ zurück, mit der diese „ QQuickRenderControl “ verknüpft ist.
Hinweis: Der QRhi existiert erst, wenn initialize() erfolgreich abgeschlossen wurde. Vorher ist der Rückgabewert null.
Hinweis: Diese Funktion ist nicht anwendbar und gibt null zurück, wenn die software -Anpassung von Qt Quick verwendet wird.
Diese Funktion wurde in Qt 6.6 eingeführt.
Siehe auch commandBuffer(), beginFrame() und endFrame().
[since 6.0] int QQuickRenderControl::samples() const
Gibt die aktuelle Anzahl der Samples zurück. 1 oder 0 bedeutet, dass kein Multisampling erfolgt.
Diese Funktion wurde in Qt 6.0 eingeführt.
Siehe auch „ setSamples()“.
[signal] void QQuickRenderControl::sceneChanged()
Dieses Signal wird ausgelöst, wenn der Szenengraph aktualisiert wird, was bedeutet, dass „ polishItems()“ und „ sync()“ aufgerufen werden müssen. Wenn „ sync()“ den Wert „true“ zurückgibt, muss „ render()“ aufgerufen werden.
Hinweis: Vermeiden Sie es, Polishing, Synchronisation und Rendering direkt auszulösen, wenn dieses Signal emittiert wird. Zögern Sie dies stattdessen lieber auf, beispielsweise mithilfe eines Timers. Dies führt zu einer besseren Leistung.
[since 6.0] void QQuickRenderControl::setSamples(int sampleCount)
Legt die Anzahl der Samples fest, die für das Multisampling verwendet werden sollen. Wenn „ sampleCount “ den Wert 0 oder 1 hat, ist das Multisampling deaktiviert.
Hinweis: Diese Funktion wird immer in Kombination mit einem Multisample-Renderziel verwendet, was bedeutet, dass „ sampleCount “ mit der an „QQuickRenderTarget::fromNativeTexture()“ übergebenen Abtastanzahl übereinstimmen muss, die wiederum mit der Abtastanzahl der nativen Textur übereinstimmen muss.
Diese Funktion wurde in Qt 6.0 eingeführt.
Siehe auch ` samples()`, ` initialize()` und ` QQuickRenderTarget`.
bool QQuickRenderControl::sync()
Diese Funktion dient dazu, die QML-Szene mit dem Rendering-Szenenbaum zu synchronisieren.
Wenn ein dedizierter Render-Thread verwendet wird, sollte der GUI-Thread für die Dauer dieses Aufrufs gesperrt werden.
Gibt „true“ zurück, wenn die Synchronisierung den Szenengraphen verändert hat.
[since 6.0] QQuickWindow *QQuickRenderControl::window() const
Gibt den „ QQuickWindow “ zurück, mit dem dieser „ QQuickRenderControl “ verknüpft ist.
Hinweis: Ein ` QQuickRenderControl ` wird beim Erstellen von ` QQuickWindow` mit einem ` QQuickWindow ` verknüpft. Vor diesem Zeitpunkt ist der Rückgabewert dieser Funktion `null`.
Diese Funktion wurde in Qt 6.0 eingeführt.
© 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.