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 = 200Pour 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.
| 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 chargent toujours de manière asynchrone. |
QQmlComponent::Asynchronous | 1 | Charge/compile le composant dans un thread d'arrière-plan. |
enum QQmlComponent::Status
Indique l'état de chargement de l'QQmlComponent.
| Constante | Valeur | Description |
|---|---|---|
QQmlComponent::Null | 0 | Cette QQmlComponent ne contient aucune donnée. Appelez loadUrl() ou setData() pour ajouter du contenu QML. |
QQmlComponent::Ready | 1 | Cette QQmlComponent est prête et la fonction create() peut être appelée. |
QQmlComponent::Loading | 2 | Cette QQmlComponent est en train de charger des données réseau. |
QQmlComponent::Error | 3 | Une 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 :
- La hiérarchie des objets 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, 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); }); [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); }); [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.