QML-Wertetypen

QML unterstützt eingebaute und benutzerdefinierte Wertetypen.

Ein Wertetyp ist ein Typ, der konzeptionell als Wert und nicht als Referenz übergeben wird, wie z.B. int oder string. Dies steht im Gegensatz zu QML-Objekttypen. Objekttypen werden per Referenz übergeben. Wenn Sie eine Instanz eines Objekttyps zwei verschiedenen Eigenschaften zuweisen, haben beide Eigenschaften denselben Wert. Die Änderung des Objekts spiegelt sich in beiden Eigenschaften wider. Wenn Sie eine Instanz eines Werttyps zwei verschiedenen Eigenschaften zuweisen, tragen die Eigenschaften getrennte Werte. Wenn Sie eine von ihnen ändern, bleibt die andere gleich. Wertetypen werden nur konzeptionell als Wert übergeben, denn es muss immer noch möglich sein, mit ihnen zu interagieren, als wären sie JavaScript-Objekte. Um dies zu erleichtern, werden sie in Wirklichkeit als Werttypreferenzen übergeben, wenn Sie von JavaScript-Code aus auf sie zugreifen.

Im Gegensatz zu einem Objekttyp kann ein Wertetyp nicht verwendet werden, um QML-Objekte zu deklarieren: Es ist z. B. nicht möglich, ein int{} -Objekt oder ein size{} -Objekt zu deklarieren.

Wertetypen können verwendet werden, um auf etwas zu verweisen:

  • einen einzelnen Wert (z.B. int bezieht sich auf eine einzelne Zahl)
  • einen Wert, der Eigenschaften und Methoden enthält (z. B. size bezieht sich auf einen Wert mit den Eigenschaften width und height )
  • Der generische Typ var. Er kann Werte eines beliebigen anderen Typs enthalten, ist aber selbst ein Wertetyp.

Wenn eine Variable oder Eigenschaft einen Werttyp enthält und dieser einer anderen Variablen oder Eigenschaft zugewiesen wird, wird eine Kopie des Wertes erstellt.

Verfügbare Wertetypen

Einige Werttypen werden von der Engine standardmäßig unterstützt und erfordern keine Importanweisung, während andere den Client dazu zwingen, das Modul zu importieren, das sie bereitstellt. Alle unten aufgeführten Wertetypen können als property Typ in einem QML-Dokument verwendet werden, mit den folgenden Ausnahmen:

  • void, der das Fehlen eines Wertes markiert
  • list muss in Verbindung mit einem Objekt oder Werttyp als Element verwendet werden
  • enumeration kann nicht direkt verwendet werden, da die Aufzählung durch einen registrierten QML-Objekttyp definiert sein muss

Eingebaute Wertetypen in der QML-Sprache

Im Folgenden sind die eingebauten Wertetypen aufgeführt, die von der QML-Sprache nativ unterstützt werden:

bool

Binärer Wahr/Falsch-Wert

date

Datumswert

double

Zahl mit Dezimalpunkt, gespeichert in doppelter Genauigkeit

enumeration

Benannter Aufzählungswert

int

Ganze Zahl, z. B. 0, 10 oder -20

list

Liste von QML-Objekten

real

Zahl mit einem Dezimalpunkt

string

Freiform-Textstring

url

Ressourcen-Locator

var

Generischer Eigenschaftstyp

variant

Generischer Eigenschaftstyp

void

Leerer Werttyp

Von QML-Modulen bereitgestellte Wertetypen

QML-Module können die QML-Sprache um weitere Wertetypen erweitern.

Die vom Modul QtQml bereitgestellten Wertetypen sind zum Beispiel:

point

Wert mit x- und y-Attributen

rect

Wert mit den Attributen x, y, Breite und Höhe

size

Wert mit den Attributen width und height

Die vom Modul QtQuick bereitgestellten Wertetypen sind:

color

ARGB-Farbwert

font

Schriftwert mit den Eigenschaften von QFont. Der Schrifttyp bezieht sich auf einen Schriftwert mit den Eigenschaften von QFont

matrix4x4

Ein Matrix4x4-Typ ist eine 4-zeilige und 4-spaltige Matrix

quaternion

Ein Quaternion-Typ hat Skalar-, x-, y- und z-Attribute

vector2d

Ein vector2d-Typ hat x- und y-Attribute

vector3d

Wert mit x-, y- und z-Attributen

vector4d

Der Typ vector4d hat die Attribute x, y, z und w

Das globale Objekt Qt bietet useful functions zur Manipulation von Werten der Wertetypen für die Qt Qml und Qt Quick Module.

Andere Qt-Module dokumentieren ihre Wertetypen auf ihren jeweiligen Modulseiten.

Sie können Ihre eigenen Wertetypen definieren, wie in Defining QML Types from C++ beschrieben. Um Typen zu verwenden, die von einem bestimmten QML-Modul bereitgestellt werden, müssen Clients dieses Modul in ihren QML-Dokumenten importieren.

Eigenschaftsänderungsverhalten für Wertetypen

Einige Wertetypen haben Eigenschaften: Der Typ font hat beispielsweise die Eigenschaften pixelSize, family und bold. Im Gegensatz zu Eigenschaften von Objekttypen bieten Eigenschaften von Werttypen keine eigenen Eigenschaftsänderungssignale. Es ist nur möglich, einen Handler für ein Eigenschaftsänderungssignal für die Eigenschaft des Werttyps selbst zu erstellen:

Text {
    // invalid!
    onFont.pixelSizeChanged: doSomething()

    // also invalid!
    font {
        onPixelSizeChanged: doSomething()
    }

    // but this is ok
    onFontChanged: doSomething()
}

Beachten Sie jedoch, dass ein Eigenschaftsänderungssignal für einen Werttyp immer dann ausgegeben wird, wenn sich eines seiner Attribute geändert hat, und auch dann, wenn sich die Eigenschaft selbst ändert. Nehmen Sie zum Beispiel den folgenden Code:

Text {
    onFontChanged: console.log("font changed")

    Text { id: otherText }

    focus: true

    // changing any of the font attributes, or reassigning the property
    // to a different font value, will invoke the onFontChanged handler
    Keys.onDigit1Pressed: font.pixelSize += 1
    Keys.onDigit2Pressed: font.b = !font.b
    Keys.onDigit3Pressed: font = otherText.font
}

Im Gegensatz dazu senden Eigenschaften eines Objekttyps ihre eigenen Eigenschaftsänderungssignale aus, und ein Eigenschaftsänderungssignal-Handler für eine Eigenschaft vom Objekttyp wird nur dann aufgerufen, wenn die Eigenschaft einem anderen Objektwert neu zugewiesen wird.

Siehe auch Das QML-Typensystem.

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