QQuickRenderControl Class
La classe `QQuickRenderControl` fournit un mécanisme permettant de rendre le graphe de scène d'Qt Quick sur une cible de rendu hors écran, de manière entièrement contrôlée par l'application. En savoir plus...
| En-tête : | #include <QQuickRenderControl> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Quick) target_link_libraries(mytarget PRIVATE Qt6::Quick) |
| qmake : | QT += quick |
| Hérite de : | QObject |
Fonctions publiques
| 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 |
Signaux
| void | renderRequested() |
| void | sceneChanged() |
Membres publics statiques
| QWindow * | renderWindowFor(QQuickWindow *win, QPoint *offset = nullptr) |
Description détaillée
QQuickWindow et QQuickView ainsi que leurs boucles de rendu internes associées permettent d’afficher la scène Qt Quick dans une fenêtre native. Dans certains cas, par exemple lors de l’intégration avec des moteurs de rendu tiers OpenGL, Vulkan, Metal ou Direct 3D, il peut être utile de convertir la scène en une texture pouvant ensuite être utilisée de manière arbitraire par le moteur de rendu externe. Un tel mécanisme est également essentiel lors de l’intégration à un framework de réalité virtuelle. QQuickRenderControl rend cela possible avec une accélération matérielle, contrairement à l’alternative limitée en termes de performances consistant à utiliser ` QQuickWindow::grabWindow()`
Lors de l’utilisation d’un `QQuickRenderControl`, l’ QQuickWindow e ne doit pas être de type ` shown ` (elle ne sera pas visible à l’écran) et il n’y aura pas de fenêtre native sous-jacente pour celle-ci. À la place, l’instance ` QQuickWindow ` est associée à l’objet de contrôle de rendu, à l’aide de la surcharge du constructeur ` QQuickWindow `, et à un objet texture ou image spécifié via ` QQuickWindow::setRenderTarget()`. L'objet ` QQuickWindow ` reste essentiel, car il représente la scène ` Qt Quick ` et fournit l'essentiel des mécanismes de gestion de la scène et de diffusion des événements. Il ne fait toutefois pas office de véritable fenêtre à l'écran du point de vue du système de fenêtrage.
La gestion des périphériques graphiques, des contextes, ainsi que des objets image et texture incombe à l'application. Le périphérique ou le contexte qui sera utilisé par ` Qt Quick ` doit être créé avant d'appeler ` initialize()`. La création de l'objet texture peut être différée, voir ci-dessous. Qt 5.4 introduit la possibilité pour QOpenGLContext d'adopter des contextes natifs existants. Associé à QQuickRenderControl, cela permet de créer un QOpenGLContext qui partage le contexte existant d’un moteur de rendu externe. Ce nouvel QOpenGLContext peut alors être utilisé pour rendre la scène Qt Quick dans une texture également accessible par le contexte de l’autre moteur. Pour Vulkan, Metal et Direct 3D, Qt ne fournit pas de wrappers pour les objets de périphérique ; les objets existants peuvent donc être transmis tels quels via ` QQuickWindow::setGraphicsDevice()` ().
Le chargement et l’instanciation des composants QML s’effectuent à l’aide d’un ` QQmlEngine`. Une fois l’objet racine créé, il devra être associé au `contentItem()` de ` QQuickWindow`.
Les applications devront généralement se connecter à 4 signaux importants :
- QQuickWindow::sceneGraphInitialized() Émis à un moment donné après l’appel de QQuickRenderControl::initialize(). À la réception de ce signal, l’application doit créer son objet framebuffer et l’associer à l’ QQuickWindow.
- QQuickWindow::sceneGraphInvalidated() Lorsque les ressources du graphe de scène sont libérées, l’objet framebuffer peut également être détruit.
- QQuickRenderControl::renderRequested() Indique que la scène doit être rendue en appelant ` render()`. Après avoir rendu le contexte actif, les applications doivent appeler ` render()`.
- QQuickRenderControl::sceneChanged() Indique que la scène a changé, ce qui signifie qu’avant le rendu, des opérations de polissage et de synchronisation sont également nécessaires.
Pour envoyer des événements, par exemple des événements de souris ou de clavier, à la scène, utilisez ` QCoreApplication::sendEvent()` en indiquant l’instance ` QQuickWindow ` comme destinataire.
Pour les événements de touche, il peut également être nécessaire de placer manuellement le focus sur l'élément souhaité. En pratique, cela implique d’appeler ` forceActiveFocus()` sur l’élément souhaité, par exemple l’élément racine de la scène, une fois qu’il est associé à la scène (le ` QQuickWindow`).
Documentation des fonctions membres
[explicit] QQuickRenderControl::QQuickRenderControl(QObject *parent = nullptr)
Crée un objet `QQuickRenderControl`, dont l'objet parent est ` parent`.
[override virtual noexcept] QQuickRenderControl::~QQuickRenderControl()
Détruit l'instance. Libère toutes les ressources du graphe de scène.
Voir aussi invalidate().
[since 6.0] void QQuickRenderControl::beginFrame()
Spécifie le début d'une trame graphique. Les appels aux fonctions ` sync()` ou ` render()` doivent être encadrés par des appels aux fonctions `beginFrame()` et ` endFrame()`.
Contrairement à l’environnement Qt 5 antérieur, exclusivement basé sur OpenGL, le rendu avec d’autres API graphiques nécessite des points de début et de fin de trame mieux définis. Lorsque la boucle de rendu est pilotée manuellement via ` QQuickRenderControl`, il incombe désormais à l’utilisateur de ` QQuickRenderControl ` de spécifier ces points.
Une étape de mise à jour typique, incluant l’initialisation du rendu dans une texture existante, pourrait se présenter comme suit. L’extrait de code ci-dessous suppose l’utilisation de Direct3D 11, mais les mêmes concepts s’appliquent également à d’autres API graphiques.
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(); // Les commandes de rendu de Qt Quick sont transmises au contexte de périphérique à cet endroitRemarque : cette fonction n’a pas besoin d’être appelée, et ne doit pas l’être, lorsque l’on utilise l’adaptation software de Qt Quick.
Remarque : en interne , les fonctions beginFrame() et endFrame() appellent respectivement beginOffscreenFrame() et endOffscreenFrame(). Cela implique qu’aucune image (ni hors écran, ni basée sur une chaîne d’échange) ne doit être en cours d’enregistrement sur l’ QRhi lorsque cette fonction est appelée.
Cette fonction a été introduite dans Qt 6.0.
Voir également endFrame(), initialize(), sync(), render(), QQuickGraphicsDevice et QQuickRenderTarget.
[since 6.6] QRhiCommandBuffer *QQuickRenderControl::commandBuffer() const
Renvoie le tampon de commandes actuel.
Une fois la fonction beginFrame() appelée, un objet ` QRhiCommandBuffer ` est automatiquement créé. Il s'agit du tampon de commande Qt Quick utilisé par le scenegraph, mais dans certains cas, les applications peuvent également souhaiter l'interroger, par exemple pour effectuer des mises à jour de ressources (comme la relecture d'une texture).
La référence au tampon de commandes renvoyée ne doit être utilisée qu’entre les appels à ` beginFrame()` et ` endFrame()`. Il existe toutefois des exceptions spécifiques : par exemple, l’appel à ` lastCompletedGpuTime()` sur le tampon de commandes immédiatement après ` endFrame()`, mais avant le prochain appel à ` beginFrame()`, est valide.
Remarque : cette fonction n’est pas applicable et renvoie null lorsque l’on utilise l’adaptation « software » de Qt Quick.
Cette fonction a été introduite dans Qt 6.6.
Voir également rhi(), beginFrame() et endFrame().
[since 6.0] void QQuickRenderControl::endFrame()
Spécifie la fin d'une trame graphique. Les appels à ` sync()` ou ` render()` doivent être encadrés par des appels à ` beginFrame()` et `endFrame()`.
Lorsque cette fonction est appelée, toutes les commandes graphiques mises en file d’attente par l’arborescence de scène sont soumises au contexte ou à la file d’attente de commandes, selon le cas.
Remarque : cette fonction n’a pas besoin d’être appelée, et ne doit pas l’être, lorsque l’on utilise l’adaptation « software » de la fonction « Qt Quick ».
Cette fonction a été introduite dans Qt 6.0.
Voir également beginFrame(), initialize(), sync(), render(), QQuickGraphicsDevice et QQuickRenderTarget.
[since 6.0] bool QQuickRenderControl::initialize()
Initialise les ressources du graphe de scène. Lorsque vous utilisez une API graphique, telle que Vulkan, Metal, OpenGL ou Direct3D, pour le rendu d’ Qt Quick, QQuickRenderControl configurera un moteur de rendu adapté lors de l’appel de cette fonction. Cette infrastructure de rendu existe tant que l’ QQuickRenderControl existe.
Pour contrôler l’API graphique utilisée par ` Qt Quick `, appelez ` QQuickWindow::setGraphicsApi()` avec l’une des constantes ` QSGRendererInterface:GraphicsApi`. Cette opération doit être effectuée avant d’appeler cette fonction.
Pour empêcher le graphe de scène de créer ses propres objets de périphérique et de contexte, spécifiez un ` QQuickGraphicsDevice` approprié, encapsulant des objets graphiques existants, en appelant ` QQuickWindow::setGraphicsDevice()`.
Pour configurer les extensions de périphérique à activer (par exemple, pour Vulkan), appelez ` QQuickWindow::setGraphicsConfiguration()` avant cette fonction.
Remarque : lors de l’utilisation de Vulkan, ` QQuickRenderControl ` ne crée pas automatiquement un ` QVulkanInstance `. Il incombe plutôt à l’application de créer un ` QVulkanInstance ` et un ` associate it ` adaptés à l’aide de ` QQuickWindow`. Avant d’initialiser le ` QVulkanInstance`, il est fortement recommandé d’interroger la liste des extensions d’instance souhaitées par ` Qt Quick` en appelant la fonction statique ` QQuickGraphicsConfiguration::preferredInstanceExtensions()` et de transmettre la liste renvoyée à ` QVulkanInstance::setExtensions()`.
Renvoie true en cas de succès, false dans le cas contraire.
Remarque : cette fonction n’a pas besoin d’être appelée, et ne doit pas l’être, lorsque l’on utilise l’adaptation « software » de « Qt Quick ».
Avec l’adaptation par défaut de ` Qt Quick `, cette fonction crée un nouvel objet ` QRhi `, de la même manière que ce qui se produirait avec un ` QQuickWindow ` à l’écran si ` QQuickRenderControl ` n’était pas utilisé. Pour que ce nouvel objet ` QRhi ` adopte une ressource de périphérique ou de contexte existante (par exemple, utiliser un ` QOpenGLContext ` existant au lieu d’en créer un nouveau), utilisez ` QQuickWindow::setGraphicsDevice()` comme mentionné ci-dessus. Lorsque l’application souhaite que le rendu de l’ Qt Quick utilise un objet QRhi déjà existant, cela est également possible via QQuickGraphicsDevice::fromRhi(). Lorsqu’un tel QQuickGraphicsDevice, faisant référence à un QRhi déjà existant, est défini, aucun nouvel objet QRhi dédié n’est créé dans initialize().
Cette fonction a été introduite dans Qt 6.0.
Voir également QQuickRenderTarget, QQuickGraphicsDevice et QQuickGraphicsConfiguration::preferredInstanceExtensions().
void QQuickRenderControl::invalidate()
Arrêter le rendu et libérer les ressources.
Cela équivaut aux opérations de nettoyage qui ont lieu avec une véritable QQuickWindow lorsque la fenêtre est masquée.
Cette fonction est appelée depuis le destructeur. Il n'est donc généralement pas nécessaire de l'appeler directement.
Une fois invalidate() appelée, il est possible de réutiliser l’instance d’ QQuickRenderControl en appelant à nouveau initialize().
Remarque : cette fonction ne prend pas en compte QQuickWindow::persistentSceneGraph() ni QQuickWindow::persistentGraphics(). Cela signifie que les ressources spécifiques au contexte sont toujours libérées.
void QQuickRenderControl::polishItems()
Cette fonction doit être appelée le plus tard possible avant l'appel de ` sync()`. Dans un environnement multithread, le rendu peut s'effectuer en parallèle avec cette fonction.
void QQuickRenderControl::prepareThread(QThread *targetThread)
Prépare le rendu de la scène Qt Quick en dehors du thread de l'interface graphique.
targetThread Spécifie le thread sur lequel la synchronisation et le rendu auront lieu. Il n'est pas nécessaire d'appeler cette fonction dans un scénario à thread unique.
void QQuickRenderControl::render()
Effectue le rendu du graphe de scène à l'aide du contexte actuel.
[signal] void QQuickRenderControl::renderRequested()
Ce signal est émis lorsque le graphe de scène doit être rendu. Il n'est pas nécessaire d'appeler la fonction ` sync()`.
Remarque : évitez de déclencher directement le rendu lorsque ce signal est émis. Préférez plutôt de le différer, par exemple à l’aide d’un temporisateur. Cela permettra d’obtenir de meilleures performances.
[virtual] QWindow *QQuickRenderControl::renderWindow(QPoint *offset)
Réimplémenté dans les sous-classes pour renvoyer la fenêtre réelle dans laquelle ce contrôle de rendu affiche son contenu.
Si ` offset ` est non nul, il est défini sur le décalage du contrôle à l'intérieur de la fenêtre.
Remarque : bien que cela ne soit pas obligatoire, la réimplémentation de cette fonction devient essentielle pour prendre en charge plusieurs écrans présentant des rapports de pixels différents et pour positionner correctement les fenêtres contextuelles ouvertes à partir de QML. Il est donc fortement recommandé de la fournir dans les sous-classes.
[static] QWindow *QQuickRenderControl::renderWindowFor(QQuickWindow *win, QPoint *offset = nullptr)
Renvoie la fenêtre réelle dans laquelle win est affiché, le cas échéant.
Si offset n’est pas nul, cette propriété est définie sur le décalage du rendu à l’intérieur de sa fenêtre.
[since 6.6] QRhi *QQuickRenderControl::rhi() const
Renvoie l'QRhi e auquel ce QQuickRenderControl est associé.
Remarque : l' QRhi n'existe que lorsquela fonction initialize() s'est exécutée avec succès. Avant cela, la valeur renvoyée est null.
Remarque : cette fonction n'est pas applicable et renvoie null lorsque l'on utilise l'adaptation « software » de la fonction Qt Quick.
Cette fonction a été introduite dans Qt 6.6.
Voir également commandBuffer(), beginFrame() et endFrame().
[since 6.0] int QQuickRenderControl::samples() const
Renvoie le nombre d'échantillons actuel. La valeur 1 ou 0 indique l'absence de multi-échantillonnage.
Cette fonction a été introduite dans Qt 6.0.
Voir aussi setSamples().
[signal] void QQuickRenderControl::sceneChanged()
Ce signal est émis lorsque le graphe de scène est mis à jour, ce qui signifie qu’il faut appeler les fonctions ` polishItems()` et ` sync()`. Si la fonction ` sync()` renvoie `true`, il faut alors appeler la fonction ` render()`.
Remarque : évitez de déclencher directement les opérations de polissage, de synchronisation et de rendu lorsque ce signal est émis. Préférez plutôt de les différer, par exemple en utilisant un minuteur. Cela permettra d'obtenir de meilleures performances.
[since 6.0] void QQuickRenderControl::setSamples(int sampleCount)
Définit le nombre d'échantillons à utiliser pour le multisampling. Lorsque la valeur de ` sampleCount ` est égale à 0 ou 1, le multisampling est désactivé.
Remarque : cette fonction est toujours utilisée en association avec une cible de rendu multisampling, ce qui signifie que la valeur de ` sampleCount ` doit correspondre au nombre d'échantillons transmis à `QQuickRenderTarget::fromNativeTexture()`, qui doit lui-même correspondre au nombre d'échantillons de la texture native.
Cette fonction a été introduite dans Qt 6.0.
Voir également samples(), initialize() et QQuickRenderTarget.
bool QQuickRenderControl::sync()
Cette fonction sert à synchroniser la scène QML avec le graphe de rendu.
Si un thread de rendu dédié est utilisé, le thread de l'interface graphique doit être bloqué pendant toute la durée de cet appel.
Renvoie « true » si la synchronisation a modifié le graphe de scène.
[since 6.0] QQuickWindow *QQuickRenderControl::window() const
Renvoie l'QQuickWindow auquel cet QQuickRenderControl est associé.
Remarque : un QQuickRenderControl est associé à un QQuickWindow lors de la construction de l’ QQuickWindow. La valeur renvoyée par cette fonction est nulle avant ce moment-là.
Cette fonction a été introduite dans 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.