QQmlComponent Class

Die Klasse QQmlComponent kapselt eine QML-Komponentendefinition. Mehr...

Kopfzeile: #include <QQmlComponent>
CMake: find_package(Qt6 REQUIRED COMPONENTS Qml)
target_link_libraries(mytarget PRIVATE Qt6::Qml)
qmake: QT += qml
In QML: Component
Vererbt: QObject

Öffentliche Typen

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

Eigenschaften

Öffentliche Funktionen

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

Öffentliche Slots

(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)

Signale

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

Detaillierte Beschreibung

Komponenten sind wiederverwendbare, gekapselte QML-Typen mit wohldefinierten Schnittstellen.

Eine QQmlComponent-Instanz kann aus einer QML-Datei erstellt werden. Zum Beispiel, wenn es eine main.qml Datei wie diese gibt:

import QtQuick 2.0

Item {
    width: 200
    height: 200
}

Der folgende Code lädt diese QML-Datei als Komponente, erstellt eine Instanz dieser Komponente mit create() und fragt dann den Wert von Item's width ab:

QQmlEngine *engine = new QQmlEngine;
QQmlComponent component(engine, QUrl::fromLocalFile("main.qml"));

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

Um Instanzen einer Komponente in Code zu erstellen, in dem keine QQmlEngine Instanz verfügbar ist, können Sie qmlContext() oder qmlEngine() verwenden. Im folgenden Szenario werden zum Beispiel untergeordnete Elemente innerhalb einer QQuickItem Unterklasse erstellt:

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);
}

Beachten Sie, dass diese Funktionen null zurückgeben, wenn sie innerhalb des Konstruktors einer QObject Unterklasse aufgerufen werden, da die Instanz noch keinen Kontext oder Motor hat.

Netzwerk-Komponenten

Wenn die an QQmlComponent übergebene URL eine Netzwerkressource ist, oder wenn das QML-Dokument eine Netzwerkressource referenziert, muss QQmlComponent die Netzwerkdaten abrufen, bevor es Objekte erstellen kann. In diesem Fall hat die QQmlComponent eine Loading status . Eine Anwendung muss warten, bis die Komponente Ready ist, bevor sie QQmlComponent::create() aufruft.

Das folgende Beispiel zeigt, wie man eine QML-Datei von einer Netzwerkressource lädt. Nachdem die QQmlComponent erstellt wurde, wird getestet, ob die Komponente geladen wird. Ist dies der Fall, wird eine Verbindung mit dem Signal QQmlComponent::statusChanged() hergestellt, andernfalls wird die Methode continueLoading() direkt aufgerufen. Beachten Sie, dass QQmlComponent::isLoading() für eine Netzwerkkomponente falsch sein kann, wenn die Komponente zwischengespeichert wurde und sofort bereit ist.

MyApplication::MyApplication() { // ...Komponente = neu QQmlComponent(engine, QUrl("http://www.example.com/main.qml")); if (component->isLoading()) { QObject::connect(komponente, &QQmlComponent::statusChanged, this, &MyApplication::continueLoading); } else { continueLoading(); } }void MyApplication::continueLoading() { if (component->isError()) {        qWarning() << component->errors();
    } else { QObject *myObject =  component->create(); } }

Dokumentation der Mitgliedstypen

enum QQmlComponent::CompilationMode

Gibt an, ob die QQmlComponent die Komponente sofort oder asynchron laden soll.

KonstanteWertBeschreibung
QQmlComponent::PreferSynchronous0Bevorzugt das sofortige Laden/Kompilieren der Komponente, wobei der Thread blockiert wird. Dies ist nicht immer möglich; z.B. werden entfernte URLs immer asynchron geladen.
QQmlComponent::Asynchronous1Laden/Kompilieren der Komponente in einem Hintergrund-Thread.

enum QQmlComponent::Status

Gibt den Ladestatus der QQmlComponent an.

KonstanteWertBeschreibung
QQmlComponent::Null0Diese QQmlComponent hat keine Daten. Rufen Sie loadUrl() oder setData() auf, um QML-Inhalte hinzuzufügen.
QQmlComponent::Ready1Diese QQmlComponent ist bereit und create() kann aufgerufen werden.
QQmlComponent::Loading2Diese QQmlComponent lädt gerade Netzwerkdaten.
QQmlComponent::Error3Es ist ein Fehler aufgetreten. Rufen Sie errors() auf, um eine Liste von errors abzurufen.

Dokumentation der Eigenschaften

[read-only] progress : const qreal

Der Fortschritt beim Laden der Komponente, von 0.0 (nichts geladen) bis 1.0 (fertig).

Zugriffsfunktionen:

qreal progress() const

Benachrichtigungssignal:

void progressChanged(qreal progress)

[read-only] status : const Status

Der aktuelle Stand der Komponente status.

Zugriffsfunktionen:

QQmlComponent::Status status() const

Melder-Signal:

void statusChanged(QQmlComponent::Status status)

[read-only] url : const QUrl

Die URL der Komponente. Dies ist die URL, die entweder an den Konstruktor oder an die Methoden loadUrl() oder setData() übergeben wird.

Zugriffsfunktionen:

QUrl url() const

Dokumentation der Mitgliedsfunktionen

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

Erstellen Sie eine QQmlComponent ohne Daten und geben Sie ihr die angegebenen engine und parent. Setzen Sie die Daten mit setData().

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

Erstellt eine QQmlComponent aus der angegebenen fileName und gibt ihr die angegebenen parent und engine.

Siehe auch loadUrl().

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

Erstellen Sie eine QQmlComponent aus der angegebenen url und geben Sie ihr die angegebenen parent und engine.

Stellen Sie sicher, dass die angegebene URL vollständig und korrekt ist, insbesondere verwenden Sie QUrl::fromLocalFile(), wenn Sie eine Datei aus dem lokalen Dateisystem laden.

Relative Pfade werden gegen QQmlEngine::baseUrl() aufgelöst, das das aktuelle Arbeitsverzeichnis ist, sofern nicht anders angegeben.

Siehe auch loadUrl().

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

Erstellt eine QQmlComponent aus der angegebenen fileName und gibt ihr die angegebenen parent und engine. Wenn mode Asynchronous ist, wird die Komponente asynchron geladen und kompiliert.

Siehe auch loadUrl().

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

Erstellen Sie eine QQmlComponent aus der angegebenen url und geben Sie ihr die angegebenen parent und engine. Wenn mode Asynchronous ist, wird die Komponente asynchron geladen und kompiliert.

Stellen Sie sicher, dass die angegebene URL vollständig und korrekt ist. Verwenden Sie insbesondere QUrl::fromLocalFile(), wenn Sie eine Datei aus dem lokalen Dateisystem laden.

Relative Pfade werden gegen QQmlEngine::baseUrl() aufgelöst, das das aktuelle Arbeitsverzeichnis ist, sofern nicht anders angegeben.

Siehe auch loadUrl().

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

Erstellt eine QQmlComponent aus den angegebenen uri und typeName und gibt ihr die angegebenen parent und engine. Wenn möglich, wird die Komponente synchron geladen.

Dies ist eine überladene Funktion.

Diese Funktion wurde in Qt 6.5 eingeführt.

Siehe auch loadFromModule().

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

Erstellt eine QQmlComponent aus den angegebenen uri und typeName und gibt ihr die angegebenen parent und engine. Wenn mode Asynchronous ist, wird die Komponente asynchron geladen und kompiliert.

Dies ist eine überladene Funktion.

Diese Funktion wurde in Qt 6.5 eingeführt.

Siehe auch loadFromModule().

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

Zerstören Sie die QQmlComponent.

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

Erstellt eine Objektinstanz aus dieser Komponente innerhalb der angegebenen context. Gibt nullptr zurück, wenn die Erstellung fehlgeschlagen ist.

Hinweis: Diese Methode bietet erweiterte Kontrolle über die Erstellung von Komponenteninstanzen. Im Allgemeinen sollten Programmierer QQmlComponent::create() verwenden, um Objektinstanzen zu erstellen.

Wenn QQmlComponent eine Instanz konstruiert, geschieht dies in drei Schritten:

  1. Die Objekthierarchie wird erstellt, und es werden konstante Werte zugewiesen.
  2. Eigenschaftsbindungen werden zum ersten Mal ausgewertet.
  3. Falls zutreffend, wird QQmlParserStatus::componentComplete() für Objekte aufgerufen.

QQmlComponent::beginCreate() unterscheidet sich von QQmlComponent::create() dadurch, dass es nur Schritt 1 ausführt. QQmlComponent::completeCreate() muss aufgerufen werden, um die Schritte 2 und 3 abzuschließen.

Diese Unterbrechung ist manchmal nützlich, wenn angehängte Eigenschaften verwendet werden, um Informationen an eine instanziierte Komponente zu übermitteln, da sie es ermöglicht, ihre Anfangswerte zu konfigurieren, bevor Eigenschaftsbindungen wirksam werden.

Das Eigentum an der zurückgegebenen Objektinstanz wird auf den Aufrufer übertragen.

Hinweis: Die Kategorisierung von Bindungen in konstante Werte und tatsächliche Bindungen ist absichtlich nicht spezifiziert und kann sich zwischen verschiedenen Versionen von Qt und abhängig davon, ob und wie Sie qmlcachegen verwenden, ändern. Sie sollten sich nicht darauf verlassen, dass eine bestimmte Bindung entweder vor oder nach der Rückkehr von beginCreate() ausgewertet wird. Zum Beispiel kann ein konstanter Ausdruck wie MyType.EnumValue zur Kompilierzeit als solcher erkannt werden oder erst später als Bindung ausgeführt werden. Das Gleiche gilt für konstante Ausdrücke wie -(5) oder "a" + " constant string".

Siehe auch completeCreate() und QQmlEngine::ObjectOwnership.

[virtual] void QQmlComponent::completeCreate()

Diese Methode bietet eine erweiterte Kontrolle über die Erstellung von Komponenteninstanzen. Im Allgemeinen sollten Programmierer QQmlComponent::create() verwenden, um eine Komponente zu erstellen.

Diese Funktion schließt die mit QQmlComponent::beginCreate() begonnene Komponentenerstellung ab und muss danach aufgerufen werden.

Siehe auch beginCreate().

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

Erstellt eine Objektinstanz aus dieser Komponente innerhalb der angegebenen context. Gibt nullptr zurück, wenn die Erstellung fehlgeschlagen ist.

Wenn context nullptr ist (die Vorgabe), wird die Instanz im root context des Motors erstellt.

Das Eigentum an der zurückgegebenen Objektinstanz wird auf den Aufrufer übertragen.

Wenn das Objekt, das von dieser Komponente erstellt wird, ein visuelles Element ist, muss es einen visuellen Elternteil haben, der durch den Aufruf von QQuickItem::setParentItem() gesetzt werden kann. Siehe Konzepte - Visual Parent in Qt Quick für weitere Details.

Siehe auch QQmlEngine::ObjectOwnership.

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

Erstellen Sie eine Objektinstanz aus dieser Komponente unter Verwendung der angegebenen incubator. context gibt den Kontext an, in dem die Objektinstanz erstellt werden soll.

Wenn context nullptr ist (standardmäßig), wird die Instanz im root context der Engine erstellt.

forContext gibt einen Kontext an, von dem diese Objekterzeugung abhängt. Wenn forContext asynchron erstellt wird und QQmlIncubator::IncubationMode QQmlIncubator::AsynchronousIfNested ist, wird dieses Objekt ebenfalls asynchron erstellt. Wenn forContext nullptr ist (standardmäßig), wird context für diese Entscheidung verwendet.

Das erstellte Objekt und sein Erstellungsstatus sind über incubator verfügbar.

Siehe auch QQmlIncubator.

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

Erstellen Sie eine Objektinstanz dieser Komponente innerhalb der angegebenen context und initialisieren Sie die Eigenschaften der obersten Ebene mit initialProperties.

Wenn eine der initialProperties nicht gesetzt werden kann, wird eine Warnung ausgegeben. Wenn es nicht gesetzte erforderliche Eigenschaften gibt, schlägt die Objekterstellung fehl und gibt nullptr zurück. In diesem Fall wird isError() true zurückgeben.

Siehe auch QQmlComponent::create.

QQmlContext *QQmlComponent::creationContext() const

Gibt die QQmlContext zurück, in der die Komponente erstellt wurde. Dies gilt nur für Komponenten, die direkt aus QML erstellt wurden.

QQmlEngine *QQmlComponent::engine() const

Gibt die QQmlEngine dieser Komponente zurück.

QList<QQmlError> QQmlComponent::errors() const

Gibt die Liste der Fehler zurück, die während des letzten Kompilier- oder Erstellungsvorgangs aufgetreten sind. Eine leere Liste wird zurückgegeben, wenn isError() nicht gesetzt ist.

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

Gibt true zurück, wenn die Komponente in einer QML-Datei erstellt wurde, die pragma ComponentBehavior: Bound angibt, andernfalls wird false zurückgegeben.

Diese Funktion wurde in Qt 6.5 eingeführt.

bool QQmlComponent::isError() const

Gibt true zurück, wenn status() == QQmlComponent::Error.

bool QQmlComponent::isLoading() const

Gibt true zurück, wenn status() == QQmlComponent::Loading.

bool QQmlComponent::isNull() const

Gibt true zurück, wenn status() == QQmlComponent::Null.

bool QQmlComponent::isReady() const

Gibt true zurück, wenn status() == QQmlComponent::Ready.

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

Laden Sie die QQmlComponent für typeName in das Modul uri. Wenn der Typ über eine QML-Datei implementiert ist, wird mode verwendet, um ihn zu laden. Typen, die von C++ unterstützt werden, werden immer synchron geladen.

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);

Diese Funktion wurde in Qt 6.5 eingeführt.

Siehe auch loadUrl().

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

Laden Sie die Datei QQmlComponent von der angegebenen url.

Vergewissern Sie sich, dass die angegebene URL vollständig und korrekt ist. Verwenden Sie insbesondere QUrl::fromLocalFile(), wenn Sie eine Datei aus dem lokalen Dateisystem laden.

Relative Pfade werden gegen QQmlEngine::baseUrl() aufgelöst, das das aktuelle Arbeitsverzeichnis ist, sofern nicht anders angegeben.

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

Laden Sie die QQmlComponent aus der bereitgestellten url. Wenn mode Asynchronous ist, wird die Komponente asynchron geladen und kompiliert.

Stellen Sie sicher, dass die angegebene URL vollständig und korrekt ist. Verwenden Sie insbesondere QUrl::fromLocalFile(), wenn Sie eine Datei aus dem lokalen Dateisystem laden.

Relative Pfade werden gegen QQmlEngine::baseUrl() aufgelöst, das das aktuelle Arbeitsverzeichnis ist, sofern nicht anders angegeben.

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

Wird ausgegeben, wenn sich der Ladefortschritt der Komponente ändert. progress ist der aktuelle Fortschritt zwischen 0.0 (nichts geladen) und 1.0 (fertig).

Hinweis: Benachrichtigungssignal für die Eigenschaft progress.

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

Legt fest, dass QQmlComponent die angegebene QML data verwendet. Wenn url angegeben ist, wird es verwendet, um den Komponentennamen festzulegen und einen Basispfad für Elemente anzugeben, die von dieser Komponente aufgelöst werden.

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

Einstellen der obersten Ebene properties der object, die aus einer QQmlComponent erstellt wurde.

Diese Methode bietet eine erweiterte Kontrolle über die Erstellung von Komponenteninstanzen. Im Allgemeinen sollten Programmierer QQmlComponent::createWithInitialProperties verwenden, um eine Objektinstanz aus einer Komponente zu erstellen.

Verwenden Sie diese Methode nach beginCreate und bevor completeCreate aufgerufen wurde. Wenn eine angegebene Eigenschaft nicht vorhanden ist, wird eine Warnung ausgegeben.

Diese Methode erlaubt es nicht, erste verschachtelte Eigenschaften direkt zu setzen. Stattdessen kann ein Anfangswert für Werttyp-Eigenschaften mit verschachtelten Eigenschaften gesetzt werden, indem dieser Werttyp erstellt, seine verschachtelte Eigenschaft zugewiesen und dann der Werttyp als Anfangseigenschaft des zu erstellenden Objekts übergeben wird.

Um zum Beispiel fond.bold zu setzen, können Sie eine QFont erstellen, ihre Gewichtung auf bold setzen und dann die Schriftart als Anfangseigenschaft übergeben.

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

Wird gesendet, wenn sich der Status der Komponente ändert. status ist der neue Status.

Hinweis: Meldesignal für die Eigenschaft status.

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