Sur cette page

QQmlIncubator Class

La classe QQmlIncubator permet de créer des objets QML de manière asynchrone. Plus d'informations...

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 - comme les 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 à ressources limitées. Lorsqu'une application utilise directement QQmlComponent::create(), l'instance de l'objet QML est créée de manière synchrone, ce qui, en fonction de la complexité de l'objet, peut entraîner des pauses ou des bégaiements notables dans l'application.

L'utilisation de QQmlIncubator permet de mieux contrôler la création d'un objet QML, et notamment de le créer de manière asynchrone en utilisant le temps d'inactivité de l'application. L'exemple suivant montre une utilisation simple de QQmlIncubator.

// Initialize the incubator
QQmlIncubator incubator;
component->create(incubator);

Laissez l'incubateur fonctionner pendant un certain temps (normalement en renvoyant le contrôle à la boucle d'événements), puis interrogez-le. Il y a plusieurs façons de revenir à l'incubateur plus tard. Vous pouvez vouloir vous connecter à l'un des signaux envoyés par QQuickWindow, ou vous pouvez lancer un QTimer spécialement pour cela. Vous pouvez également avoir besoin de l'objet dans un but précis et interroger l'incubateur lorsque ce besoin se présente.

// Poll the incubator
if (incubator.isReady()) {
    QObject *object = incubator.object();
    // Use created object
}

Les incubateurs asynchrones sont contrôlés par un QQmlIncubationController défini sur QQmlEngine, qui indique au moteur quand l'application est inactive et que les objets incubés doivent être traités. Si aucun contrôleur d'incubation n'est défini sur QQmlEngine, QQmlIncubator crée des objets de manière synchrone, indépendamment de IncubationMode. 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 QQmlEnginerespectifs. Ces contrôleurs d'incubation espacent les incubations sur plusieurs images pendant que la vue est rendue.

QQmlIncubator prend en charge trois modes d'incubation :

  • Synchrone La création se produit de manière synchrone. C'est-à-dire qu'une fois que l'appel QQmlComponent::create() est retourné, l'incubateur est déjà dans l'état Error ou Ready. Un incubateur synchrone n'a pas d'avantage réel par rapport à l'utilisation directe des méthodes de création synchrone sur QQmlComponent, mais il peut simplifier la mise en œuvre d'une application en utilisant la même API pour les créations synchrones et asynchrones.
  • Asynchrone (par défaut) La création se produit de manière asynchrone, en supposant qu'un QQmlIncubatorController soit défini sur le site QQmlEngine.

    L'incubateur reste dans l'état Loading jusqu'à ce que la création soit terminée ou qu'une erreur se produise. Le rappel statusChanged() peut être utilisé pour être informé 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 sont 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 fait partie d'une création asynchrone imbriquée, ou de manière synchrone dans le cas contraire.

    Dans la plupart des scénarios où un composant QML veut avoir l'apparence d'une instanciation synchrone, il doit utiliser ce mode.

    La meilleure façon d'expliquer ce mode est de le présenter à l'aide d'un exemple. Lorsque le type ListView est créé pour la première fois, il doit se doter d'un ensemble initial de délégués à afficher. Si le site ListView a une hauteur de 400 pixels et que chaque délégué a une hauteur de 100 pixels, il doit créer quatre instances de délégués initiales. Si le site ListView utilise le mode d'incubation asynchrone, le site ListView sera toujours créé vide, puis, un peu plus tard, les quatre éléments initiaux apparaîtront.

    Inversement, si le site ListView utilisait le mode d'incubation synchrone, il se comporterait correctement mais pourrait introduire des bégaiements dans l'application. Comme QML devrait s'arrêter et instancier les délégués de ListView de manière synchrone, si ListView faisait partie d'un composant QML qui était 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 ListView sont instanciés de manière asynchrone si le ListView 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 que lorsque toutes les instanciations imbriquées se seront également achevées. Cela garantit qu'au moment où l'instanciation asynchrone externe se termine, les éléments internes tels que ListView ont déjà terminé le chargement de leurs délégués initiaux.

    Il est presque toujours incorrect d'utiliser le mode d'incubation synchrone - les éléments ou les composants qui veulent l'apparence d'une instanciation synchrone, mais sans les inconvénients d'introduire des gels ou des bégaiements dans l'application, devraient 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 QQmlIncubator se comportera de manière synchrone si le QQmlEngine n'est pas associé à un QQmlIncubationController.

ConstanteValeurDescription de l'objet
QQmlIncubator::Asynchronous0L'objet sera créé de manière asynchrone.
QQmlIncubator::AsynchronousIfNested1Si l'objet est créé dans un contexte qui fait 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 sera pas prête tant que cette incubation et elle-même ne seront pas terminées. Dans le cas contraire, l'incubation s'exécutera de manière synchrone.
QQmlIncubator::Synchronous2L'objet sera créé de manière synchrone.

enum QQmlIncubator::Status

Spécifie l'état du site QQmlIncubator.

ConstanteValeurDescription de l'état
QQmlIncubator::Null0L'incubation n'est pas en cours. Appelez QQmlComponent::create() pour commencer l'incubation.
QQmlIncubator::Ready1L'objet est entièrement créé et peut être accédé en appelant object().
QQmlIncubator::Loading2L'objet est en cours de création.
QQmlIncubator::Error3Une erreur s'est produite. L'erreur est accessible en appelant errors().

Documentation des fonctions membres

QQmlIncubator::QQmlIncubator(QQmlIncubator::IncubationMode mode = Asynchronous)

Créez un nouvel incubateur avec les données spécifiées mode

void QQmlIncubator::clear()

Efface l'incubateur. Toute incubation en cours est interrompue. Si l'incubateur est dans l'état Prêt, l'objet créé n' est pas supprimé.

QList<QQmlError> QQmlIncubator::errors() const

Retourne la liste des erreurs rencontrées lors de l'incubation de l'objet.

void QQmlIncubator::forceCompletion()

Force toute incubation en cours à se terminer de manière synchrone. Lorsque cet appel est renvoyé, l'incubateur n'est plus en état de chargement.

QQmlIncubator::IncubationMode QQmlIncubator::incubationMode() const

Renvoie le mode d'incubation transmis au constructeur de QQmlIncubator.

bool QQmlIncubator::isError() const

Retourne true si la fonction status() de l'incubateur est Error.

bool QQmlIncubator::isLoading() const

Retourne true si la fonction status() de l'incubateur est Loading.

bool QQmlIncubator::isNull() const

Retourne true si la valeur de status() de l'incubateur est Null.

bool QQmlIncubator::isReady() const

Retourne true si la fonction status() de l'incubateur est Ready.

QObject *QQmlIncubator::object() const

Renvoie l'objet incubé si le statut est Prêt, sinon 0.

void QQmlIncubator::setInitialProperties(const QVariantMap &initialProperties)

Enregistre une correspondance entre les noms des propriétés et les valeurs initiales, contenues dans initialProperties, avec lesquelles le composant incubé sera initialisé.

Voir également QQmlComponent::setInitialProperties.

[virtual protected] void QQmlIncubator::setInitialState(QObject *object)

Appelé après la création de object, mais avant l'évaluation des liaisons de propriétés complexes et, le cas échéant, l'appel de QQmlParserStatus::componentComplete(). C'est l'équivalent du point entre 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 liaisons simples, telles que les valeurs numériques littérales, sont évaluées avant que setInitialState() ne soit appelée. La catégorisation des liaisons en simples et complexes est intentionnellement non spécifiée et peut changer entre les versions de Qt et selon que vous utilisez qmlcachegen ou non. Vous ne devez pas compter sur une liaison particulière pour être évaluée avant ou après l'appel de setInitialState(). Par exemple, une expression constante comme MyType.EnumValue peut être reconnue comme telle au moment de la compilation ou différée pour être exécutée en tant que liaison. Il en va de même pour les expressions constantes telles que -(5) ou "a" + " constant string".

QQmlIncubator::Status QQmlIncubator::status() const

Renvoie l'état actuel de l'incubateur.

[virtual protected] void QQmlIncubator::statusChanged(QQmlIncubator::Status status)

Appelé lorsque le statut de l'incubateur change. status est le nouveau statut.

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.