Component QML Type

Kapselt eine QML-Komponentendefinition. Mehr...

Import Statement: import QtQml
In C++: QQmlComponent

Eigenschaften

Angehängte Signale

Methoden

Detaillierte Beschreibung

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

Komponenten werden oft durch Komponentendateien definiert, d.h. durch .qml Dateien. Der Komponententyp ermöglicht es im Wesentlichen, QML-Komponenten inline innerhalb eines QML-Dokuments zu definieren, anstatt sie als separate QML-Datei zu erstellen. Dies kann nützlich sein, um eine kleine Komponente innerhalb einer QML-Datei wiederzuverwenden oder um eine Komponente zu definieren, die logisch zu anderen QML-Komponenten innerhalb einer Datei gehört.

Hier ist zum Beispiel eine Komponente, die von mehreren Loader Objekten verwendet wird. Sie enthält ein einziges Element, ein Rectangle:

import QtQuick

Item {
    width: 100; height: 100

    Component {
        id: redSquare

        Rectangle {
            color: "red"
            width: 10
            height: 10
        }
    }

    Loader { sourceComponent: redSquare }
    Loader { sourceComponent: redSquare; x: 20 }
}

Beachten Sie, dass ein Rectangle automatisch gerendert und angezeigt wird, während dies bei dem obigen Rechteck nicht der Fall ist, da es innerhalb eines Component definiert ist. Die Komponente kapselt die darin enthaltenen QML-Typen, als ob sie in einer separaten QML-Datei definiert wären, und wird erst geladen, wenn sie angefordert wird (in diesem Fall von den beiden Loader -Objekten). Da Component nicht von Item abgeleitet ist, können Sie nichts an ihr verankern.

Die Definition einer Component ist ähnlich wie die eines QML-Dokuments. Ein QML-Dokument hat ein einziges Element der obersten Ebene, das das Verhalten und die Eigenschaften dieser Komponente definiert, und kann keine Eigenschaften oder Verhalten außerhalb dieses Elements der obersten Ebene definieren. Genauso enthält eine Component -Definition ein einziges Element der obersten Ebene (im obigen Beispiel ein Rectangle) und kann keine Daten außerhalb dieses Elements definieren, mit Ausnahme einer id (im obigen Beispiel redSquare).

Der Typ Component wird in der Regel verwendet, um grafische Komponenten für Ansichten bereitzustellen. Beispielsweise erfordert die Eigenschaft ListView::delegate eine Component, um anzugeben, wie jedes Listenelement angezeigt werden soll.

Component Objekte können auch dynamisch mit Qt.createComponent() erstellt werden.

Erstellungskontext

Der Erstellungskontext einer Component entspricht dem Kontext, in dem die Component deklariert wurde. Dieser Kontext wird als übergeordneter Kontext (zur Bildung einer Kontexthierarchie) verwendet, wenn die Komponente durch ein Objekt wie ListView oder einen Loader instanziiert wird.

Im folgenden Beispiel wird comp1 im Wurzelkontext von MyItem.qml erstellt, und alle Objekte, die von dieser Komponente instanziiert werden, haben Zugriff auf die ids und Eigenschaften innerhalb dieses Kontexts, z. B. internalSettings.color. Wenn comp1 als ListView Delegierter in einem anderen Kontext verwendet wird (wie in main.qml unten), hat es weiterhin Zugriff auf die Eigenschaften seines Erstellungskontextes (die ansonsten für externe Benutzer privat wären).

MeinElement.qml
Item {
    property Component mycomponent: comp1

    QtObject {
        id: internalSettings
        property color color: "green"
    }

    Component {
        id: comp1
        Rectangle { color: internalSettings.color; width: 400; height: 50 }
    }
}
main.qml
ListView {
    width: 400; height: 400
    model: 5
    delegate: myItem.mycomponent    //will create green Rectangles

    MyItem { id: myItem }
}

Es ist wichtig, dass die Lebensdauer des Erstellungskontextes die der erstellten Objekte überdauert. Weitere Informationen finden Sie unter Pflege dynamisch erstellter Objekte.

Eigenschaft Dokumentation

progress : real [read-only]

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


status : enumeration [read-only]

Diese Eigenschaft enthält den Status des Komponentenladens. Der Status kann einer der folgenden sein:

KonstanteBeschreibung
Component.Nulles sind keine Daten für die Komponente verfügbar
Component.Readydie Komponente wurde geladen und kann zum Erstellen von Instanzen verwendet werden.
Component.Loadingdie Komponente wird gerade geladen
Component.Errorbeim Laden der Komponente ist ein Fehler aufgetreten. Der Aufruf von errorString() liefert eine von Menschen lesbare Beschreibung aller Fehler.

url : url [read-only]

Die URL der Komponente. Dies ist die URL, die zur Erstellung der Komponente verwendet wurde.


Dokumentation des angehängten Signals

completed()

Wird ausgesendet, nachdem das Objekt instanziiert wurde. Dies kann verwendet werden, um Skriptcode beim Start auszuführen, sobald die vollständige QML-Umgebung eingerichtet ist.

Der onCompleted signal handler kann auf jedem Objekt deklariert werden. Die Reihenfolge, in der die Handler ausgeführt werden, ist undefiniert.

Rectangle {
    Component.onCompleted: console.log("Completed Running!")
    Rectangle {
        Component.onCompleted: console.log("Nested Completed Running!")
    }
}

Hinweis: Der entsprechende Handler ist onCompleted.


destruction()

Wird ausgegeben, wenn die Zerstörung des Objekts beginnt. Dies kann verwendet werden, um Arbeiten rückgängig zu machen, die als Reaktion auf das Signal completed() oder anderen zwingenden Code in Ihrer Anwendung ausgeführt wurden.

Der onDestruction Signalhandler kann für jedes Objekt deklariert werden. Die Reihenfolge, in der die Handler ausgeführt werden, ist undefiniert.

Rectangle {
    Component.onDestruction: console.log("Destruction Beginning!")
    Rectangle {
        Component.onDestruction: console.log("Nested Destruction Beginning!")
    }
}

Hinweis: Der entsprechende Handler ist onDestruction.

Siehe auch Qt Qml.


Dokumentation der Methode

QtObject createObject(QtObject parent, object properties)

Erzeugt und gibt eine Objektinstanz dieser Komponente zurück, die die angegebenen parent und properties hat. Das Argument properties ist optional. Gibt null zurück, wenn die Objekterstellung fehlschlägt.

Das Objekt wird in demselben Kontext erstellt, in dem die Komponente erstellt wurde. Diese Funktion gibt immer null zurück, wenn sie für Komponenten aufgerufen wird, die nicht in QML erstellt wurden.

Wenn Sie ein Objekt erstellen möchten, ohne ein Elternteil zu setzen, geben Sie null für den Wert parent an. Beachten Sie, dass Sie, wenn das zurückgegebene Objekt angezeigt werden soll, einen gültigen parent Wert angeben oder die parent Eigenschaft des zurückgegebenen Objekts setzen müssen, da das Objekt sonst nicht sichtbar ist.

Wenn createObject() kein parent übergeben wird, muss ein Verweis auf das zurückgegebene Objekt gehalten werden, damit es nicht vom Garbage Collector zerstört wird. Dies gilt unabhängig davon, ob anschließend Item::parent gesetzt wird, da das Setzen des Item-Elternteils nicht den Besitz des Objekts ändert. Nur der grafische Elternteil wird geändert.

Ab QtQuick 1.1 akzeptiert diese Methode ein optionales properties Argument, das eine Zuordnung von anfänglichen Eigenschaftswerten für das erstellte Objekt angibt. Diese Werte werden angewendet, bevor die Objekterstellung abgeschlossen ist. Dies ist effizienter als das Festlegen von Eigenschaftswerten nach der Objekterzeugung, insbesondere wenn große Mengen von Eigenschaftswerten definiert werden, und ermöglicht auch das Einrichten von Eigenschaftsbindungen (mit Qt.binding), bevor das Objekt erzeugt wird.

Das Argument properties wird als eine Karte von Eigenschaftswertelementen angegeben. Der folgende Code erstellt beispielsweise ein Objekt mit den Anfangswerten x und y von 100 bzw. 100:

const component = Qt.createComponent("Button.qml");
if (component.status === Component.Ready) {
    component.createObject(parent, { x: 100, y: 100 });
}

Dynamisch erstellte Instanzen können mit der Methode destroy() gelöscht werden. Weitere Informationen finden Sie unter Dynamische QML-Objekterstellung aus JavaScript.

Siehe auch incubateObject().


string errorString()

Gibt eine menschenlesbare Beschreibung eines Fehlers zurück.

Die Zeichenkette enthält die Datei, den Ort und die Beschreibung jedes Fehlers. Wenn mehrere Fehler vorhanden sind, werden sie durch einen Zeilenumbruch getrennt.

Wenn keine Fehler vorhanden sind, wird eine leere Zeichenfolge zurückgegeben.


object incubateObject(QtObject parent, object properties, enumeration mode)

Erzeugt einen Inkubator für eine Instanz dieser Komponente. Inkubatoren ermöglichen die asynchrone Instanzierung neuer Komponenteninstanzen und führen nicht zum Einfrieren der Benutzeroberfläche.

Das Argument parent gibt den Elternteil an, den die erstellte Instanz haben wird. Wird der Parameter weggelassen oder null übergeben, wird ein Objekt ohne Elternteil erstellt. In diesem Fall muss ein Verweis auf das erstellte Objekt gehalten werden, damit es nicht durch den Garbage Collector zerstört wird.

Das Argument properties wird als eine Map von Property-Value-Elementen angegeben, die für das erstellte Objekt während seiner Erstellung festgelegt werden. mode kann Qt.Synchronous oder Qt.Asynchronous sein und steuert, ob die Instanz synchron oder asynchron erstellt wird. Die Voreinstellung ist asynchron. Unter bestimmten Umständen kann der Inkubator das Objekt asynchron erstellen, auch wenn Qt.Synchronous angegeben ist. Dies geschieht, wenn die Komponente, die incubateObject() aufruft, selbst asynchron erstellt wird.

Alle drei Argumente sind optional.

Bei Erfolg gibt die Methode einen Inkubator zurück, andernfalls null. Der Inkubator hat die folgenden Eigenschaften:

  • status - Der Status des Inkubators. Gültige Werte sind Component.Ready, Component.Loading und Component.Error.
  • object - Die erstellte Objektinstanz. Ist nur verfügbar, wenn der Inkubator den Status Ready hat.
  • onStatusChanged - Gibt eine Callback-Funktion an, die aufgerufen wird, wenn sich der Status ändert. Der Status wird als Parameter an den Callback übergeben.
  • forceCompletion() - Aufruf, um die Inkubation synchron zu beenden.

Das folgende Beispiel zeigt, wie ein Inkubator verwendet wird:

const component = Qt.createComponent("Button.qml");

const incubator = component.incubateObject(parent, { x: 10, y: 10 });
if (incubator.status !== Component.Ready) {
    incubator.onStatusChanged = function(status) {
        if (status === Component.Ready) {
            print("Object", incubator.object, "is now ready!");
        }
    };
} else {
    print("Object", incubator.object, "is ready immediately!");
}

Dynamisch erstellte Instanzen können mit der Methode destroy() gelöscht werden. Weitere Informationen finden Sie unter Dynamische QML-Objekterzeugung aus JavaScript.

Siehe auch createObject().


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