QQmlComponent Class
La classe QQmlComponent encapsule une définition de composant QML. Plus d'informations...
| 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éritages : | 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, s'il existe 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 Item:
QQmlEngine *moteur = nouveau 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ù une instance QQmlEngine n'est pas disponible, vous pouvez utiliser qmlContext() ou qmlEngine(). Par exemple, dans le scénario ci-dessous, des éléments enfants sont créés dans une sous-classe 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 renvoient null lorsqu'elles sont appelées dans le constructeur d'une sous-classe QObject, car l'instance n'a pas encore de contexte ni de moteur.
Composants du réseau
Si l'URL transmise au 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 une adresse 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 teste 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 le composant a été mis en cache et est prêt immédiatement.
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 le site QQmlComponent doit charger le composant immédiatement ou de manière asynchrone.
| Constante | Valeur | Description |
|---|---|---|
QQmlComponent::PreferSynchronous | 0 | Préfère charger/compiler le composant immédiatement, en bloquant le thread. Cela n'est pas toujours possible ; par exemple, les URL distantes se chargeront toujours de manière asynchrone. |
QQmlComponent::Asynchronous | 1 | Charger/compiler le composant dans un thread d'arrière-plan. |
enum QQmlComponent::Status
Spécifie l'état de chargement du site QQmlComponent.
| Constante | Valeur | Description de l'état de chargement |
|---|---|---|
QQmlComponent::Null | 0 | Ce site QQmlComponent ne contient aucune donnée. Appelez loadUrl() ou setData() pour ajouter du contenu QML. |
QQmlComponent::Ready | 1 | Ce QQmlComponent est prêt et create() peut être appelé. |
QQmlComponent::Loading | 2 | Ce QQmlComponent est en train de charger des données de réseau. |
QQmlComponent::Error | 3 | Une erreur s'est produite. Appelez errors() pour récupérer une liste de errors. |
Documentation sur les propriétés
[read-only] progress : qreal
L'état d'avancement du chargement du composant, de 0.0 (rien chargé) à 1.0 (terminé).
Fonctions d'accès :
| qreal | progress() const |
Signal de notification :
| void | progressChanged(qreal progress) |
[read-only] status : Status
L'adresse actuelle du composant status.
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 au constructeur ou 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 donnez-lui les valeurs spécifiées engine et parent. Définissez les données à l'aide de setData().
QQmlComponent::QQmlComponent(QQmlEngine *engine, const QString &fileName, QObject *parent = nullptr)
Crée un QQmlComponent à partir de l'adresse fileName et lui attribue les adresses parent et engine.
Voir aussi loadUrl().
QQmlComponent::QQmlComponent(QQmlEngine *engine, const QUrl &url, QObject *parent = nullptr)
Créer un QQmlComponent à partir de l'adresse url et lui donner les adresses parent et engine.
Assurez-vous que l'URL fournie est complète et correcte ; en particulier, utilisez QUrl::fromLocalFile() pour charger un fichier à partir du système de fichiers local.
Les chemins relatifs seront résolus par rapport à QQmlEngine::baseUrl(), qui est le répertoire de travail actuel, sauf indication contraire.
Voir aussi loadUrl().
QQmlComponent::QQmlComponent(QQmlEngine *engine, const QString &fileName, QQmlComponent::CompilationMode mode, QObject *parent = nullptr)
Créer un QQmlComponent à partir de fileName et lui donner les adresses parent et engine. Si mode est Asynchronous, le composant sera chargé et compilé de manière asynchrone.
Voir aussi loadUrl().
QQmlComponent::QQmlComponent(QQmlEngine *engine, const QUrl &url, QQmlComponent::CompilationMode mode, QObject *parent = nullptr)
Créer un QQmlComponent à partir de l'adresse url et lui donner les adresses parent et engine. 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() pour charger un fichier à partir du système de fichiers local.
Les chemins relatifs seront résolus par rapport à QQmlEngine::baseUrl(), qui est le répertoire de travail actuel, sauf indication contraire.
Voir aussi loadUrl().
[explicit, since 6.5] QQmlComponent::QQmlComponent(QQmlEngine *engine, QAnyStringView uri, QAnyStringView typeName, QObject *parent = nullptr)
Créer un QQmlComponent à partir des éléments uri et typeName et lui donner les éléments 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 aussi loadFromModule().
[explicit, since 6.5] QQmlComponent::QQmlComponent(QQmlEngine *engine, QAnyStringView uri, QAnyStringView typeName, QQmlComponent::CompilationMode mode, QObject *parent = nullptr)
Créer un QQmlComponent à partir des éléments uri et typeName et lui donner les éléments parent et engine. Si mode est 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 aussi loadFromModule().
[override virtual noexcept] QQmlComponent::~QQmlComponent()
Détruire le site QQmlComponent.
[virtual] QObject *QQmlComponent::beginCreate(QQmlContext *context)
Crée une instance d'objet à partir de ce composant, dans les limites de l'adresse context. Retourne 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 devraient utiliser QQmlComponent::create() pour créer des instances d'objets.
La construction d'une instance par QQmlComponent s'effectue en trois étapes :
- La hiérarchie de l'objet est créée et des valeurs constantes sont attribuées.
- Les liaisons de propriétés sont évaluées pour la première fois.
- Le cas échéant, QQmlParserStatus::componentComplete() est appelé sur les objets.
QQmlComponent::beginCreate() diffère de QQmlComponent::create() en ce sens qu'il n'exécute que l'étape 1. QQmlComponent::completeCreate() doit être appelé pour compléter les étapes 2 et 3.
Ce point de rupture est parfois utile lorsque l'on utilise des propriétés attaché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 retournée est transférée à l'appelant.
Note : La catégorisation des liaisons en valeurs constantes et en liaisons réelles 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 le retour de beginCreate(). 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".
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 général, les programmeurs devraient utiliser QQmlComponent::create() pour créer un composant.
Cette fonction termine la création du composant commencée avec QQmlComponent::beginCreate() et doit être appelée ensuite.
Voir aussi beginCreate().
[virtual] QObject *QQmlComponent::create(QQmlContext *context = nullptr)
Crée une instance d'objet à partir de ce composant, dans le délai spécifié context. Renvoie nullptr si la création a échoué.
Si context est nullptr (par défaut), l'instance sera créée dans le 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éer une instance d'objet à partir de ce composant à l'aide de l'adresse incubator. context indique le contexte dans lequel créer l'instance d'objet.
Si context est nullptr (par défaut), l'instance sera créée dans le root context du moteur.
forContext spécifie un contexte dont dépend la création de l'objet. Si forContext est créé de manière asynchrone et que QQmlIncubator::IncubationMode est QQmlIncubator::AsynchronousIfNested, cet objet sera également créé de manière asynchrone. Si forContext est nullptr (par défaut), context sera utilisé pour cette décision.
L'objet créé et son statut de création sont disponibles via incubator.
Voir également QQmlIncubator.
QObject *QQmlComponent::createWithInitialProperties(const QVariantMap &initialProperties, QQmlContext *context = nullptr)
Créer une instance d'objet de ce composant, dans l'espace spécifié context, et initialiser ses propriétés de premier niveau avec initialProperties.
Si l'une des propriétés initialProperties ne peut être définie, un avertissement est émis. Si des propriétés obligatoires ne sont pas définies, la création de l'objet échoue et renvoie nullptr, auquel cas isError() renvoie true.
Si context est nullptr (par défaut), l'instance sera créée dans le root context du moteur.
La propriété de l'instance d'objet renvoyée est transférée à l'appelant.
Voir aussi QQmlComponent::create.
QQmlContext *QQmlComponent::creationContext() const
Retourne le site QQmlContext dans lequel le composant a été créé. Ceci n'est valable que pour les composants créés directement à partir de QML.
QQmlEngine *QQmlComponent::engine() const
Renvoie l'adresse QQmlEngine 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 isError() n'est pas défini.
[since 6.5] bool QQmlComponent::isBound() const
Retourne vrai si le composant a été créé dans un fichier QML qui spécifie pragma ComponentBehavior: Bound, sinon retourne faux.
Cette fonction a été introduite dans Qt 6.5.
bool QQmlComponent::isError() const
Retourne vrai si status() == QQmlComponent::Error.
bool QQmlComponent::isLoading() const
Retourne vrai si status() == QQmlComponent::Loading.
bool QQmlComponent::isNull() const
Retourne vrai si status() == QQmlComponent::Null.
bool QQmlComponent::isReady() const
Retourne vrai si status() == QQmlComponent::Ready.
[slot, since 6.5] void QQmlComponent::loadFromModule(QAnyStringView uri, QAnyStringView typeName, QQmlComponent::CompilationMode mode = PreferSynchronous)
Charger le QQmlComponent pour typeName dans le module uri. Si le type est implémenté via un fichier QML, mode est utilisé pour le charger. Les types soutenus par 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 aussi loadUrl().
[slot] void QQmlComponent::loadUrl(const QUrl &url)
Chargez le fichier QQmlComponent à partir de l'adresse url.
Assurez-vous que l'URL fournie est complète et correcte. En particulier, utilisez QUrl::fromLocalFile() pour charger un fichier à partir du système de fichiers local.
Les chemins relatifs seront résolus par rapport à QQmlEngine::baseUrl(), qui est le répertoire de travail actuel, sauf indication contraire.
Note : Ce slot est surchargé. Pour se 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); }); [slot] void QQmlComponent::loadUrl(const QUrl &url, QQmlComponent::CompilationMode mode)
Charger le QQmlComponent à partir du url fourni. 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() pour charger un fichier à partir du système de fichiers local.
Les chemins relatifs seront résolus par rapport à QQmlEngine::baseUrl(), qui est le répertoire de travail actuel, sauf indication contraire.
Note : Ce slot est surchargé. Pour se 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); }); [signal] void QQmlComponent::progressChanged(qreal progress)
Emis chaque fois que la progression du chargement du composant change. progress sera la progression actuelle entre 0.0 (rien de chargé) et 1.0 (terminé).
Note : Signal de notification pour la propriété progress.
[slot] void QQmlComponent::setData(const QByteArray &data, const QUrl &url)
Configure le QQmlComponent pour qu'il utilise le QML data donné. Si url est fourni, il est utilisé pour définir le nom du composant et pour fournir un chemin de base pour les éléments résolus par ce composant.
Attention : Le nouveau composant éclipsera tout composant existant ayant la même URL. Vous ne devez pas fournir l'URL d'un composant existant.
void QQmlComponent::setInitialProperties(QObject *object, const QVariantMap &properties)
Définir le niveau supérieur properties du 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 général, les programmeurs devraient utiliser QQmlComponent::createWithInitialProperties pour créer une instance d'objet à partir d'un composant.
Utilisez cette méthode après beginCreate et avant 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 initiales imbriquées. Au lieu de cela, la définition d'une valeur initiale pour les propriétés de type valeur avec des propriétés imbriquées peut être réalisée en créant ce type de valeur, en affectant sa propriété imbriquée et en passant ensuite le type de valeur en tant que propriété initiale de l'objet à construire.
Par exemple, pour définir fond.bold, vous pouvez créer un QFont, définir son poids sur bold, puis passer la police comme propriété initiale.
[signal] void QQmlComponent::statusChanged(QQmlComponent::Status status)
Emis chaque fois que l'état du composant change. status sera le nouvel état.
Note : Signal de 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.