QML-Sequenztypen
Für jeden Objekt- und Wertetyp wird automatisch ein Sequenztyp zum Speichern mehrerer Instanzen des Typs zur Verfügung gestellt. Mit dem Schlüsselwort list
können Sie Eigenschaften von Sequenztypen erstellen:
import QtQml QtObject { property list<int> ints: [1, 2, 3, 4] property list<Connection> connections: [ Connection { // ... }, Connection { // ... } ] }
Sequenzen von Wertetypen sind als QList und Sequenzen von Objekttypen als QQmlListProperty implementiert.
Sequenzen in QML verhalten sich im Allgemeinen wie der JavaScript-Typ Array
, mit einigen wichtigen Unterschieden, die sich aus der Verwendung eines C++-Speichertyps in der Implementierung ergeben:
- Das Löschen eines Elements aus einer Sequenz führt dazu, dass dieses Element durch einen standardmäßig konstruierten Wert ersetzt wird, und nicht durch einen
undefined
Wert. - Das Setzen der
length
Eigenschaft einer Sequenz auf einen Wert, der größer ist als ihr aktueller Wert, führt dazu, dass die Sequenz auf die angegebene Länge mit standardmäßig konstruierten Elementen aufgefüllt wird, anstatt mitundefined
Elementen. - Die Qt-Containerklassen unterstützen vorzeichenbehaftete (und nicht vorzeichenlose) Integer-Indizes; der Versuch, auf einen Index zuzugreifen, der größer ist als die maximale Anzahl, die qsizetype aufnehmen kann, schlägt daher fehl.
Wenn Sie Elemente aus einer Sequenz entfernen möchten, anstatt sie einfach durch konstruierte Standardwerte zu ersetzen, verwenden Sie nicht den indizierten Löschoperator (delete sequence[i]
), sondern verwenden Sie stattdessen die Funktion splice
(sequence.splice(startIndex, deleteCount)
).
Im Allgemeinen kann jeder Container, der von QMetaSequence erkannt wird, von C++ an QML über die Methoden Q_PROPERTY oder Q_INVOKABLE übergeben werden. Dies beinhaltet, ist aber nicht beschränkt auf, alle registrierten QList, QQueue, QStack, QSet, std::list, std::vector, die einen mit Q_DECLARE_METATYPE markierten Typ enthalten.
Die Verwendung einer Sequenz über QMetaSequence führt zu teuren Datenkonvertierungen. Um die Konvertierungen zu vermeiden, können Sie Ihre eigenen anonymen Sequenztypen mit QML_SEQUENTIAL_CONTAINER von C++ aus registrieren. Auf diese Weise registrierte Typen verhalten sich wie die vordefinierten Sequenztypen und werden so gespeichert, wie sie sind. Sie haben jedoch keine QML-Namen.
Achtung! Sequenzen, die in einem C++-Container wie QList oder std::vector
gespeichert sind, unterliegen den Auswirkungen von QML Value Type und Sequence References und sollten daher mit Vorsicht behandelt werden. QQmlListProperty ist davon nicht betroffen, da es sich nur um eine Ansicht für einen darunter liegenden Container handelt. C++-Standardcontainer wie std::vector
werden nicht implizit gemeinsam genutzt. Daher erzeugt das Kopieren von ihnen immer eine Deep Copy. Da eine aus einer Eigenschaft gelesene Sequenz immer mindestens einmal kopiert werden muss, ist die Verwendung solcher Container als QML-Sequenzen ziemlich teuer, selbst wenn man sie von QML aus nicht verändert.
Das Modul QtQml enthält ein paar sequence types, die Sie vielleicht verwenden möchten.
© 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.