Sur cette page

QQmlComponent Class

La classe QQmlComponent encapsule la définition d'un composant QML. En savoir plus...

En-tête : #include <QQmlComponent>
CMake : find_package(Qt6 REQUIRED COMPONENTS Qml)
target_link_libraries(mytarget PRIVATE Qt6::Qml)
qmake : QT += qml
En QML : Component
Hérite de : QObject

Types publics

enum CompilationMode { PreferSynchronous, Asynchronous }
enum Status { Null, Ready, Loading, Error }

Propriétés

Fonctions publiques

QQmlComponent(QQmlEngine *engine, QObject *parent = nullptr)
QQmlComponent(QQmlEngine *engine, const QString &fileName, QObject *parent = nullptr)
QQmlComponent(QQmlEngine *engine, const QUrl &url, QObject *parent = nullptr)
QQmlComponent(QQmlEngine *engine, const QString &fileName, QQmlComponent::CompilationMode mode, QObject *parent = nullptr)
QQmlComponent(QQmlEngine *engine, const QUrl &url, QQmlComponent::CompilationMode mode, QObject *parent = nullptr)
(since 6.5) QQmlComponent(QQmlEngine *engine, QAnyStringView uri, QAnyStringView typeName, QObject *parent = nullptr)
(since 6.5) QQmlComponent(QQmlEngine *engine, QAnyStringView uri, QAnyStringView typeName, QQmlComponent::CompilationMode mode, QObject *parent = nullptr)
virtual ~QQmlComponent() override
virtual QObject *beginCreate(QQmlContext *context)
virtual void completeCreate()
virtual QObject *create(QQmlContext *context = nullptr)
void create(QQmlIncubator &incubator, QQmlContext *context = nullptr, QQmlContext *forContext = nullptr)
QObject *createWithInitialProperties(const QVariantMap &initialProperties, QQmlContext *context = nullptr)
QQmlContext *creationContext() const
QQmlEngine *engine() const
QList<QQmlError> errors() const
(since 6.5) bool isBound() const
bool isError() const
bool isLoading() const
bool isNull() const
bool isReady() const
qreal progress() const
void setInitialProperties(QObject *object, const QVariantMap &properties)
QQmlComponent::Status status() const
QUrl url() const

Emplacements publics

(since 6.5) void loadFromModule(QAnyStringView uri, QAnyStringView typeName, QQmlComponent::CompilationMode mode = PreferSynchronous)
void loadUrl(const QUrl &url)
void loadUrl(const QUrl &url, QQmlComponent::CompilationMode mode)
void setData(const QByteArray &data, const QUrl &url)

Signaux

void progressChanged(qreal progress)
void statusChanged(QQmlComponent::Status status)

Description détaillée

Les composants sont des types QML réutilisables et encapsulés, dotés d’interfaces bien définies.

Une instance de `QQmlComponent` peut être créée à partir d'un fichier QML. Par exemple, si l'on dispose d'un fichier ` main.qml ` comme celui-ci :

import QtQuick 2.0

Item {
    width: 200
    height: 200
}

Le code suivant charge ce fichier QML en tant que composant, crée une instance de ce composant à l'aide de create(), puis interroge la valeur width de l'Item:

QQmlEngine*engine = new QQmlEngine;
QQmlComponent component(engine, QUrl::fromLocalFile("main.qml"));
if (component.isError()) {
    qWarning() << "Failed to load main.qml:" << component.errors();
   return 1;
}

QObject*myObject = component.create();
if (component.isError()) {
    qWarning() << "Failed to create instance of main.qml:" << component.errors();
   return 1;
}

QQuickItem*item = qobject_cast<QQuickItem*>(myObject);
int width = item->width();  // width = 200

Pour créer des instances d’un composant dans du code où aucune instance de ` QQmlEngine ` n’est disponible, vous pouvez utiliser ` qmlContext()` ou ` qmlEngine()`. Par exemple, dans le scénario ci-dessous, des éléments enfants sont créés au sein d’une sous-classe de ` QQuickItem ` :

void MyCppItem::init()
{
    QQmlEngine *engine = qmlEngine(this);
    // Or:
    // QQmlEngine *engine = qmlContext(this)->engine();
    QQmlComponent component(engine, QUrl::fromLocalFile("MyItem.qml"));
    QQuickItem *childItem = qobject_cast<QQuickItem*>(component.create());
    childItem->setParentItem(this);
}

Notez que ces fonctions renverront null lorsqu’elles sont appelées à l’intérieur du constructeur d’une sous-classe de QObject, car l’instance ne disposera pas encore de contexte ni de moteur.

Composants réseau

Si l’URL transmise à QQmlComponent est une ressource réseau, ou si le document QML fait référence à une ressource réseau, le QQmlComponent doit récupérer les données réseau avant de pouvoir créer des objets. Dans ce cas, le QQmlComponent aura un Loading status . Une application devra attendre que le composant soit Ready avant d’appeler QQmlComponent::create().

L’exemple suivant montre comment charger un fichier QML à partir d’une ressource réseau. Après avoir créé le QQmlComponent, il vérifie si le composant est en cours de chargement. Si c’est le cas, il se connecte au signal QQmlComponent::statusChanged() ; sinon, il appelle directement la méthode continueLoading(). Notez que QQmlComponent::isLoading() peut être faux pour un composant réseau si celui-ci a été mis en cache et est immédiatement prêt.

MyApplication::MyApplication()
{
    // ...
    component = new QQmlComponent(engine, QUrl("http://www.example.com/main.qml"));
    if (component->isLoading()) {
        QObject::connect(component, &QQmlComponent::statusChanged,
                         this, &MyApplication::continueLoading);
    } else {
        continueLoading();
    }
}

void MyApplication::continueLoading()
{
    if (component->isError()) {
        qWarning() << component->errors();
    } else {
        QObject*myObject = component->create();
    }
}

Documentation sur les types de membres

enum QQmlComponent::CompilationMode

Indique si l'QQmlComponent e doit charger le composant immédiatement ou de manière asynchrone.

ConstanteValeurDescription
QQmlComponent::PreferSynchronous0Préfère charger/compiler le composant immédiatement, en bloquant le thread. Cela n’est pas toujours possible ; par exemple, les URL distantes se chargent toujours de manière asynchrone.
QQmlComponent::Asynchronous1Charge/compile le composant dans un thread d'arrière-plan.

enum QQmlComponent::Status

Indique l'état de chargement de l'QQmlComponent.

ConstanteValeurDescription
QQmlComponent::Null0Cette QQmlComponent ne contient aucune donnée. Appelez loadUrl() ou setData() pour ajouter du contenu QML.
QQmlComponent::Ready1Cette QQmlComponent est prête et la fonction create() peut être appelée.
QQmlComponent::Loading2Cette QQmlComponent est en train de charger des données réseau.
QQmlComponent::Error3Une erreur s'est produite. Appelez errors() pour récupérer une liste de errors.

Documentation des propriétés

[read-only] progress : qreal

La progression du chargement du composant, de 0,0 (rien n'est chargé) à 1,0 (chargement terminé).

Fonctions d'accès :

qreal progress() const

Signal de notification :

void progressChanged(qreal progress)

[read-only] status : Status

status s actuelles du composant.

Fonctions d'accès :

QQmlComponent::Status status() const

Signal de notification :

void statusChanged(QQmlComponent::Status status)

[read-only] url : const QUrl

L'URL du composant. Il s'agit de l'URL transmise soit au constructeur, soit aux méthodes ` loadUrl()` ou ` setData()`.

Fonctions d'accès :

QUrl url() const

Documentation des fonctions membres

QQmlComponent::QQmlComponent(QQmlEngine *engine, QObject *parent = nullptr)

Créez un QQmlComponent sans données et attribuez-lui les propriétés engine et parent. Définissez les données à l'aide de la méthode setData().

QQmlComponent::QQmlComponent(QQmlEngine *engine, const QString &fileName, QObject *parent = nullptr)

Créez un QQmlComponent à partir de l'fileName fournie et attribuez-lui les valeurs spécifiées pour parent et engine.

Voir également loadUrl().

QQmlComponent::QQmlComponent(QQmlEngine *engine, const QUrl &url, QObject *parent = nullptr)

Créez un QQmlComponent à partir de l'url fournie et attribuez-lui les paramètres parent et engine spécifiés.

Assurez-vous que l'URL fournie est complète et correcte ; en particulier, utilisez QUrl::fromLocalFile() lorsque vous chargez un fichier à partir du système de fichiers local.

Les chemins relatifs seront résolus par rapport à QQmlEngine::baseUrl(), qui correspond au répertoire de travail actuel sauf indication contraire.

Voir également loadUrl().

QQmlComponent::QQmlComponent(QQmlEngine *engine, const QString &fileName, QQmlComponent::CompilationMode mode, QObject *parent = nullptr)

Crée un QQmlComponent à partir de l'fileName fourni et lui attribue les valeurs spécifiées pour parent et engine. Si mode vaut Asynchronous, le composant sera chargé et compilé de manière asynchrone.

Voir également loadUrl().

QQmlComponent::QQmlComponent(QQmlEngine *engine, const QUrl &url, QQmlComponent::CompilationMode mode, QObject *parent = nullptr)

Créez un QQmlComponent à partir de l'url fournie et attribuez-lui les paramètres parent et engine spécifiés. Si mode est Asynchronous, le composant sera chargé et compilé de manière asynchrone.

Assurez-vous que l’URL fournie est complète et correcte ; en particulier, utilisez ` QUrl::fromLocalFile()` lorsque vous chargez un fichier à partir du système de fichiers local.

Les chemins relatifs seront résolus par rapport à QQmlEngine::baseUrl(), qui correspond au répertoire de travail actuel sauf indication contraire.

Voir également loadUrl().

[explicit, since 6.5] QQmlComponent::QQmlComponent(QQmlEngine *engine, QAnyStringView uri, QAnyStringView typeName, QObject *parent = nullptr)

Crée un QQmlComponent à partir des paramètres uri et typeName fournis, et lui attribue les valeurs spécifiées pour parent et engine. Si possible, le composant sera chargé de manière synchrone.

Il s'agit d'une fonction surchargée.

Cette fonction a été introduite dans Qt 6.5.

Voir également loadFromModule().

[explicit, since 6.5] QQmlComponent::QQmlComponent(QQmlEngine *engine, QAnyStringView uri, QAnyStringView typeName, QQmlComponent::CompilationMode mode, QObject *parent = nullptr)

Crée un QQmlComponent à partir des paramètres fournis uri et typeName, et lui attribue les valeurs spécifiées parent et engine. Si mode vaut Asynchronous, le composant sera chargé et compilé de manière asynchrone.

Il s'agit d'une fonction surchargée.

Cette fonction a été introduite dans Qt 6.5.

Voir également loadFromModule().

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

Détruisez l'QQmlComponent.

[virtual] QObject *QQmlComponent::beginCreate(QQmlContext *context)

Crée une instance d'objet à partir de ce composant, dans l'context spécifiée. Renvoie « nullptr » si la création a échoué.

Remarque : cette méthode offre un contrôle avancé sur la création d’instances de composants. En général, les programmeurs doivent utiliser ` QQmlComponent::create()` pour créer des instances d’objets.

Lorsque QQmlComponent construit une instance, cela se déroule en trois étapes :

  1. La hiérarchie des objets est créée et des valeurs constantes sont attribuées.
  2. Les liaisons de propriétés sont évaluées pour la première fois.
  3. Le cas échéant, la méthode ` QQmlParserStatus::componentComplete()` est appelée sur les objets.

La méthode `QQmlComponent::beginCreate()` diffère de ` QQmlComponent::create()` en ce qu’elle n’effectue que l’étape 1. La méthode ` QQmlComponent::completeCreate()` doit être appelée pour mener à bien les étapes 2 et 3.

Ce point de rupture est parfois utile lors de l’utilisation de propriétés associées pour communiquer des informations à un composant instancié, car il permet de configurer leurs valeurs initiales avant que les liaisons de propriétés ne prennent effet.

La propriété de l’instance d’objet renvoyée est transférée à l’appelant.

Remarque : la classification des liaisons en valeurs constantes et en liaisons réelles 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 compter sur l’évaluation d’une liaison particulière avant ou après le retour de beginCreate(). Par exemple, une expression constante telle que ` MyType.EnumValue ` peut être reconnue comme telle lors 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 ».

Voir également ` completeCreate()` et ` QQmlEngine::ObjectOwnership`.

[virtual] void QQmlComponent::completeCreate()

Cette méthode offre un contrôle avancé sur la création d'instances de composants. En règle générale, les programmeurs doivent utiliser la fonction QQmlComponent::create() pour créer un composant.

Cette fonction finalise la création du composant lancée par QQmlComponent::beginCreate() et doit être appelée par la suite.

Voir également beginCreate().

[virtual] QObject *QQmlComponent::create(QQmlContext *context = nullptr)

Crée une instance d'objet à partir de ce composant, dans l'context spécifiée. Renvoie « nullptr » si la création a échoué.

Si context est nullptr (valeur par défaut), l’instance sera créée dans l’ root context du moteur.

La propriété de l’instance d’objet renvoyée est transférée à l’appelant.

Si l’objet créé à partir de ce composant est un élément visuel, il doit avoir un parent visuel, qui peut être défini en appelant QQuickItem::setParentItem(). Voir Concepts - Parent visuel dans Qt Quick pour plus de détails.

Voir également QQmlEngine::ObjectOwnership.

void QQmlComponent::create(QQmlIncubator &incubator, QQmlContext *context = nullptr, QQmlContext *forContext = nullptr)

Créez une instance d'objet à partir de ce composant à l'aide de la méthode incubator fournie. context spécifie le contexte dans lequel l'instance d'objet doit être créée.

Si context est nullptr (valeur par défaut), l’instance sera créée dans l’ root context du moteur.

forContext Spécifie un contexte dont dépend la création de cet objet. Si l’ forContext est créé de manière asynchrone et que le QQmlIncubator::IncubationMode est QQmlIncubator::AsynchronousIfNested, cet objet sera également créé de manière asynchrone. Si forContext est nullptr (par défaut), le context sera utilisé pour prendre cette décision.

L'objet créé et son état de création sont accessibles via la méthode incubator.

Voir également QQmlIncubator.

QObject *QQmlComponent::createWithInitialProperties(const QVariantMap &initialProperties, QQmlContext *context = nullptr)

Créez une instance de cet objet, dans l'context spécifiée, et initialisez ses propriétés de premier niveau à l'aide de initialProperties.

Si l’une des propriétés de ` initialProperties ` ne peut pas être définie, un avertissement est émis. S’il existe des propriétés obligatoires non définies, la création de l’objet échoue et renvoie ` nullptr` ; dans ce cas, la méthode ` isError()` renverra ` true`.

Si context est défini sur nullptr (valeur par défaut), l’instance sera créée dans l’espace de noms root context du moteur.

La propriété de l’instance d’objet renvoyée est transférée à l’appelant.

Voir également QQmlComponent::create.

QQmlContext *QQmlComponent::creationContext() const

Renvoie l'QQmlContext e dans laquelle le composant a été créé. Cela ne s'applique qu'aux composants créés directement à partir de QML.

QQmlEngine *QQmlComponent::engine() const

Renvoie l'QQmlEngine ion de ce composant.

QList<QQmlError> QQmlComponent::errors() const

Renvoie la liste des erreurs survenues lors de la dernière opération de compilation ou de création. Une liste vide est renvoyée si la fonction ` isError()` n'est pas définie.

[since 6.5] bool QQmlComponent::isBound() const

Renvoie « true » si le composant a été créé dans un fichier QML spécifiant ` pragma ComponentBehavior: Bound`, sinon renvoie « false ».

Cette fonction a été introduite dans Qt 6.5.

bool QQmlComponent::isError() const

Renvoie « true » si status() == QQmlComponent::Error.

bool QQmlComponent::isLoading() const

Renvoie « true » si ` status()` == ` QQmlComponent::Loading`.

bool QQmlComponent::isNull() const

Renvoie « true » si ` status()` == ` QQmlComponent::Null`.

bool QQmlComponent::isReady() const

Renvoie « true » si ` status()` == ` QQmlComponent::Ready`.

[slot, since 6.5] void QQmlComponent::loadFromModule(QAnyStringView uri, QAnyStringView typeName, QQmlComponent::CompilationMode mode = PreferSynchronous)

Chargez l'QQmlComponent e de typeName dans le module uri. Si le type est implémenté via un fichier QML, la fonction mode est utilisée pour le charger. Les types implémentés en C++ sont toujours chargés de manière synchrone.

QQmlEngine engine;
QQmlComponent component(&engine);
component.loadFromModule("QtQuick", "Item");
// once the component is ready
std::unique_ptr<QObject> item(component.create());
Q_ASSERT(item->metaObject() == &QQuickItem::staticMetaObject);

Cette fonction a été introduite dans Qt 6.5.

Voir également loadUrl().

[slot] void QQmlComponent::loadUrl(const QUrl &url)

Chargez le fichier « QQmlComponent » à partir de l'URL fournie : url.

Assurez-vous que l'URL fournie est complète et correcte ; en particulier, utilisez QUrl::fromLocalFile() lorsque vous chargez un fichier à partir du système de fichiers local.

Les chemins relatifs seront résolus par rapport à QQmlEngine::baseUrl(), qui correspond au répertoire de travail actuel sauf indication contraire.

Remarque : ce slot est surchargé. Pour vous connecter à ce slot :

// Connect using qOverload:
connect(sender, &SenderClass::signal,
        qmlComponent, qOverload(&QQmlComponent::loadUrl));

// Or using a lambda as wrapper:
connect(sender, &SenderClass::signal,
        qmlComponent, [receiver = qmlComponent](const QUrl &url) { receiver->loadUrl(url); });
Pour plus d’exemples et d’approches, consultez la section « Connexion à des slots surchargés ».

[slot] void QQmlComponent::loadUrl(const QUrl &url, QQmlComponent::CompilationMode mode)

Chargez le fichier « QQmlComponent » à partir de l'URL fournie : url. Si mode est Asynchronous, le composant sera chargé et compilé de manière asynchrone.

Assurez-vous que l'URL fournie est complète et correcte ; en particulier, utilisez ` QUrl::fromLocalFile()` lorsque vous chargez un fichier à partir du système de fichiers local.

Les chemins relatifs seront résolus par rapport à QQmlEngine::baseUrl(), qui correspond au répertoire de travail actuel sauf indication contraire.

Remarque : ce slot est surchargé. Pour vous connecter à ce slot :

// Connect using qOverload:
connect(sender, &SenderClass::signal,
        qmlComponent, qOverload(&QQmlComponent::loadUrl));

// Or using a lambda as wrapper:
connect(sender, &SenderClass::signal,
        qmlComponent, [receiver = qmlComponent](const QUrl &url, QQmlComponent::CompilationMode mode) { receiver->loadUrl(url, mode); });
Pour plus d’exemples et d’approches, consultez la section « Connexion à des slots surchargés ».

[signal] void QQmlComponent::progressChanged(qreal progress)

Émis chaque fois que la progression du chargement du composant change. progress correspond à la progression actuelle, comprise entre 0,0 (rien de chargé) et 1,0 (chargement terminé).

Remarque : signalde notification pour la propriété progress.

[slot] void QQmlComponent::setData(const QByteArray &data, const QUrl &url)

Définit l'QQmlComponent e pour qu'il utilise l'data QML spécifiée. Si l'url e est fournie, elle sert à définir le nom du composant et à fournir un chemin de base pour les éléments résolus par ce composant. Le composant sera chargé et compilé de manière synchrone.

Avertissement : le nouveau composant masquera tout composant existant portant la même URL. Vous ne devez pas transmettre l'URL d'un composant existant.

void QQmlComponent::setInitialProperties(QObject *object, const QVariantMap &properties)

Définit l'properties de niveau supérieur de l'object, qui a été créé à partir d'un QQmlComponent.

Cette méthode offre un contrôle avancé sur la création d’instances de composants. En règle générale, les programmeurs doivent utiliser la méthode ` QQmlComponent::createWithInitialProperties ` pour créer une instance d’objet à partir d’un composant.

Utilisez cette méthode après l’appel de ` beginCreate ` et avant celui de ` completeCreate `. Si une propriété fournie n’existe pas, un avertissement est émis.

Cette méthode ne permet pas de définir directement des propriétés imbriquées initiales. Pour définir une valeur initiale pour les propriétés de type « value » comportant des propriétés imbriquées, il convient de créer ce type de valeur, d’y attribuer sa propriété imbriquée, puis de transmettre ce type de valeur en tant que propriété initiale de l’objet à construire.

Par exemple, pour définir `fond.bold`, vous pouvez créer une ` QFont`, définir son `weight` sur `bold`, puis transmettre la police en tant que propriété initiale.

[signal] void QQmlComponent::statusChanged(QQmlComponent::Status status)

Émis chaque fois que l'état du composant change. status correspondra au nouvel état.

Remarque : signalde notification pour la propriété status.

© 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.