QQmlIncubator Class
La classe QQmlIncubator permet de créer des objets QML de manière asynchrone. En savoir plus...
| En-tête : | #include <QQmlIncubator> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Qml) target_link_libraries(mytarget PRIVATE Qt6::Qml) |
| qmake : | QT += qml |
Types publics
| enum | IncubationMode { Asynchronous, AsynchronousIfNested, Synchronous } |
| enum | Status { Null, Ready, Loading, Error } |
Fonctions publiques
| QQmlIncubator(QQmlIncubator::IncubationMode mode = Asynchronous) | |
| void | clear() |
| QList<QQmlError> | errors() const |
| void | forceCompletion() |
| QQmlIncubator::IncubationMode | incubationMode() const |
| bool | isError() const |
| bool | isLoading() const |
| bool | isNull() const |
| bool | isReady() const |
| QObject * | object() const |
| void | setInitialProperties(const QVariantMap &initialProperties) |
| QQmlIncubator::Status | status() const |
Fonctions protégées
| virtual void | setInitialState(QObject *object) |
| virtual void | statusChanged(QQmlIncubator::Status status) |
Description détaillée
La création d'objets QML — tels que des délégués dans une vue ou une nouvelle page dans une application — peut prendre un temps considérable, en particulier sur les appareils mobiles aux ressources limitées. Lorsqu'une application utilise directement la fonction ` QQmlComponent::create()`, l'instance de l'objet QML est créée de manière synchrone, ce qui, selon la complexité de l'objet, peut entraîner des pauses ou des saccades perceptibles dans l'application.
L'utilisation de `QQmlIncubator` offre un meilleur contrôle sur la création d'un objet QML, notamment en permettant de le créer de manière asynchrone en exploitant les temps d'inactivité de l'application. L'exemple suivant illustre une utilisation simple de `QQmlIncubator`.
// Initialize the incubator
QQmlIncubator incubator;
component->create(incubator);Laissez l’incubateur s’exécuter pendant un certain temps (généralement en rendant le contrôle à la boucle d’événements), puis interrogez-le. Il existe plusieurs façons de revenir à l’incubateur ultérieurement. Vous pouvez vous connecter à l’un des signaux émis par ` QQuickWindow`, ou exécuter une fonction ` QTimer ` spécialement prévue à cet effet. Il se peut également que vous ayez besoin de l’objet à des fins spécifiques et que vous interrogiez l’incubateur lorsque ces besoins se présentent.
// Poll the incubator
if (incubator.isReady()) {
QObject *object = incubator.object();
// Use created object
}Les incubateurs asynchrones sont contrôlés par un signal « QQmlIncubationController » défini sur l’ QQmlEngine, qui indique au moteur quand l’application est inactive et que les objets en incubation doivent être traités. Si aucun contrôleur d’incubation n’est défini sur le paramètre « QQmlEngine », « QQmlIncubator » crée les objets de manière synchrone, quel que soit le paramètre « IncubationMode » spécifié. Par défaut, aucun contrôleur d’incubation n’est défini. Cependant, « QQuickView », « QQuickWindow » et « QQuickWidget » définissent tous des contrôleurs d’incubation sur leurs paramètres « QQmlEngine» respectifs. Ces contrôleurs d’incubation répartissent les incubations sur plusieurs images pendant le rendu de la vue.
QQmlIncubator prend en charge trois modes d’incubation :
- Synchrone : la création s’effectue de manière synchrone. Autrement dit, dès que l’appel à ` QQmlComponent::create()` renvoie une valeur, l’incubateur se trouve déjà dans l’état « Error » (Erreur) ou « Ready » (Prêt). Un incubateur synchrone ne présente aucun avantage réel par rapport à l’utilisation directe des méthodes de création synchrones sur ` QQmlComponent `, mais l’utilisation d’une même API pour les créations synchrones et asynchrones peut simplifier l’implémentation d’une application.
- Asynchrone (par défaut) La création s’effectue de manière asynchrone, à condition qu’un `QQmlIncubatorController` soit défini sur ` QQmlEngine`.
L’incubateur restera à l’état « Loading » jusqu’à ce que la création soit terminée ou qu’une erreur se produise. La fonction de rappel statusChanged() peut être utilisée pour être averti des changements d’état.
Les applications doivent utiliser le mode d’incubation asynchrone pour créer des objets qui ne sont pas nécessaires immédiatement. Par exemple, le type ` ListView ` utilise l’incubation asynchrone pour créer des objets qui se trouvent légèrement hors de l’écran pendant le défilement de la liste. Si, au cours de la création asynchrone, l’objet est nécessaire immédiatement, la méthode ` QQmlIncubator::forceCompletion()` peut être appelée pour terminer le processus de création de manière synchrone.
- AsynchronousIfNested La création se fera de manière asynchrone si elle s'inscrit dans le cadre d'une création asynchrone imbriquée, ou de manière synchrone dans le cas contraire.
Dans la plupart des cas où un composant QML souhaite donner l’impression d’une instanciation synchrone, il doit utiliser ce mode.
Un exemple permet de mieux comprendre ce mode. Lorsque le type ` ListView ` est créé pour la première fois, il doit se remplir d’un ensemble initial de délégués à afficher. Si l’ ListView avait une hauteur de 400 pixels et que chaque délégué mesurait 100 pixels de haut, il faudrait créer quatre instances initiales de délégués. Si l’ ListView utilisait le mode d’incubation asynchrone, l’ ListView serait toujours créé vide, puis, un peu plus tard, les quatre éléments initiaux apparaîtraient.
À l’inverse, si l’ ListView utilisait le mode d’incubation synchrone, elle se comporterait correctement, mais cela pourrait entraîner des saccades dans l’application. Comme QML devrait s’arrêter pour instancier de manière synchrone les délégués de l’ ListView, si l’ ListView faisait partie d’un composant QML instancié de manière asynchrone, cela annulerait une grande partie des avantages de l’instanciation asynchrone.
Le mode « AsynchronousIfNested » résout ce problème. En utilisant ` AsynchronousIfNested`, les délégués de l’ ListView sont instanciés de manière asynchrone si l’ ListView e lui-même fait déjà partie d’une instanciation asynchrone, et de manière synchrone dans le cas contraire. Dans le cas d’une instanciation asynchrone imbriquée, l’instanciation asynchrone externe ne s’achèvera qu’une fois que toutes les instanciations imbriquées auront également été menées à bien. Cela garantit qu’au moment où l’instanciation asynchrone externe s’achève, les éléments internes tels que ListView ont déjà terminé le chargement de leurs délégués initiaux.
Il est presque toujours inapproprié d’utiliser le mode d’incubation « Synchronous » : les éléments ou composants qui souhaitent donner l’impression d’une instanciation synchrone, sans pour autant présenter les inconvénients liés à l’apparition de blocages ou de saccades dans l’application, doivent utiliser le mode d’incubation « AsynchronousIfNested ».
Documentation sur les types de membres
enum QQmlIncubator::IncubationMode
Spécifie le mode de fonctionnement de l'incubateur. Quel que soit le mode d'incubation, un objet ` QQmlIncubator ` se comportera de manière synchrone si l'QQmlEngine ` ne dispose pas d'un paramètre ` QQmlIncubationController ` défini.
| Constante | Valeur | Description |
|---|---|---|
QQmlIncubator::Asynchronous | 0 | L’objet sera créé de manière asynchrone. |
QQmlIncubator::AsynchronousIfNested | 1 | Si l’objet est créé dans un contexte faisant déjà partie d’une création asynchrone, cet incubateur rejoindra l’incubation existante et s’exécutera de manière asynchrone. L’incubation existante ne passera pas à l’état « Prêt » tant que celle-ci et la présente incubation ne seront pas toutes deux terminées. Dans le cas contraire, l’incubation s’exécutera de manière synchrone. |
QQmlIncubator::Synchronous | 2 | L'objet sera créé de manière synchrone. |
enum QQmlIncubator::Status
Indique l'état de l'QQmlIncubator.
| Constante | Valeur | Description |
|---|---|---|
QQmlIncubator::Null | 0 | L'incubation n'est pas en cours. Appelez QQmlComponent::create() pour lancer l'incubation. |
QQmlIncubator::Ready | 1 | L'objet est entièrement créé et est accessible en appelant object(). |
QQmlIncubator::Loading | 2 | L'objet est en cours de création. |
QQmlIncubator::Error | 3 | Une erreur s'est produite. Les erreurs sont accessibles en appelant errors(). |
Documentation des fonctions membres
QQmlIncubator::QQmlIncubator(QQmlIncubator::IncubationMode mode = Asynchronous)
Créer un nouvel incubateur avec les paramètres indiqués mode
void QQmlIncubator::clear()
Vide l'incubateur. Toute incubation en cours est interrompue. Si l'incubateur est à l'état « Prêt », l'objet créé n' est pas supprimé.
QList<QQmlError> QQmlIncubator::errors() const
Renvoie la liste des erreurs survenues lors de l'incubation de l'objet.
void QQmlIncubator::forceCompletion()
Forcer la fin synchrone de toute incubation en cours. Une fois cet appel terminé, l'incubateur ne sera plus à l'état « Loading ».
QQmlIncubator::IncubationMode QQmlIncubator::incubationMode() const
Renvoie le mode d'incubation transmis au constructeur de ` QQmlIncubator `.
bool QQmlIncubator::isError() const
Renvoie « true » si la méthode ` status()` de l'incubateur renvoie une erreur.
bool QQmlIncubator::isLoading() const
Renvoie « true » si la propriété status() de l'incubateur a la valeur « Loading ».
bool QQmlIncubator::isNull() const
Renvoie « true » si la méthode status() de l'incubateur est nulle.
bool QQmlIncubator::isReady() const
Renvoie « true » si l'status() de l'incubateur est prêt.
QObject *QQmlIncubator::object() const
Renvoie l'objet incubé si son état est « Ready », sinon 0.
void QQmlIncubator::setInitialProperties(const QVariantMap &initialProperties)
Enregistre un mappage entre les noms de propriétés et leurs valeurs initiales, contenues dans ` initialProperties`, qui serviront à initialiser le composant en incubation.
Voir également QQmlComponent::setInitialProperties.
[virtual protected] void QQmlIncubator::setInitialState(QObject *object)
Appelée après la création initiale de l'object, mais avant l'évaluation des liaisons de propriétés complexes et, le cas échéant, avant l'appel de la méthode ` QQmlParserStatus::componentComplete()`. Cela correspond au moment situé entre les méthodes ` QQmlComponent::beginCreate()` et ` QQmlComponent::completeCreate()`, et peut être utilisé pour attribuer des valeurs initiales aux propriétés de l'objet.
L’implémentation par défaut ne fait rien.
Remarque : les liaisonssimples , telles que les littéraux numériques, sont évaluées avant l’appel de `setInitialState()`. La classification des liaisons en liaisons simples et complexes n’est pas spécifiée intentionnellement et peut varier d’une version de Qt à l’autre, ainsi qu’en fonction de l’utilisation ou non de qmlcachegen et de la manière dont vous l’utilisez. Vous ne devez pas vous fier à une liaison particulière pour qu’elle soit évaluée avant ou après l’appel de setInitialState(). Par exemple, une expression constante telle que MyType.EnumValue peut être reconnue comme telle au moment de la compilation ou son exécution peut être différée pour être traitée comme une liaison. Il en va de même pour les expressions constantes telles que -(5) ou « a » + « chaîne constante ».
QQmlIncubator::Status QQmlIncubator::status() const
Renvoie l'état actuel de l'incubateur.
[virtual protected] void QQmlIncubator::statusChanged(QQmlIncubator::Status status)
Appelée lorsque l'état de l'incubateur change. ` status ` correspond au nouvel état.
L’implémentation par défaut ne fait rien.
© 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.