ListModel QML Type
Definiert eine frei gestaltbare Listen-Datenquelle. Mehr...
| Import Statement: | import QtQml.Models |
Eigenschaften
- count : int
- dynamicRoles : bool
Methoden
- void append(jsobject dict)
- void clear()
- var get(int index)
- void insert(int index, jsobject dict)
- void move(int from, int to, int n)
- void remove(int index, int count)
- void set(int index, jsobject dict)
- void setProperty(int index, string property, var value)
- void sync()
Ausführliche Beschreibung
Das ListModel ist ein einfacher Container für „ ListElement “-Definitionen, die jeweils Datenrollen enthalten. Der Inhalt kann dynamisch oder explizit in QML definiert werden.
Die Anzahl der Elemente im Modell kann über die Eigenschaft „ count “ abgerufen werden. Zur Bearbeitung des Modellinhalts stehen zudem eine Reihe bekannter Methoden zur Verfügung, darunter „ append()“, „ insert()“, „ move()“, „ remove()“ und „ set()“. Diese Methoden akzeptieren Wörterbücher als Argumente; diese werden vom Modell in „ ListElement “-Objekte umgewandelt.
Elemente können über das Modell mithilfe der Methode ` setProperty()` bearbeitet werden, mit der die Rollen des angegebenen Elements festgelegt und geändert werden können.
`ListModel` erbt von ` QAbstractListModel ` und stellt die Methoden ` Q_INVOKABLE ` zur Verfügung. Sie können beispielsweise ` QAbstractItemModel::index ` verwenden, um ein ` QModelIndex ` für eine Zeile und eine Spalte abzurufen.
Anwendungsbeispiel
Das folgende Beispiel zeigt ein `ListModel` mit drei Elementen und den Rollen „name“ und „cost“.

import QtQuick
ListModel {
id: fruitModel
ListElement {
name: "Apple"
cost: 2.45
}
ListElement {
name: "Orange"
cost: 3.25
}
ListElement {
name: "Banana"
cost: 1.95
}
}Rollen (Eigenschaften) in jedem Element müssen mit einem Kleinbuchstaben beginnen und sollten für alle Elemente in einem Modell einheitlich sein. Die Dokumentation zu „ ListElement “ enthält weitere Richtlinien zur Definition von Elementen.
Da das Beispielmodell eine „ id “-Eigenschaft enthält, kann darauf von Ansichten verwiesen werden, wie beispielsweise von der „ ListView “ in diesem Beispiel:
import QtQuick
Rectangle {
width: 200; height: 200
ListModel {
id: fruitModel
...
}
Component {
id: fruitDelegate
Row {
spacing: 10
Text { text: name }
Text { text: '$' + cost }
}
}
ListView {
anchors.fill: parent
model: fruitModel
delegate: fruitDelegate
}
}Rollen können Listendaten enthalten. Im folgenden Beispiel erstellen wir eine Liste mit Obstattributen:
ListModel {
id: fruitModel
ListElement {
name: "Apple"
cost: 2.45
attributes: [
ListElement { description: "Core" },
ListElement { description: "Deciduous" }
]
}
ListElement {
name: "Orange"
cost: 3.25
attributes: [
ListElement { description: "Citrus" }
]
}
ListElement {
name: "Banana"
cost: 1.95
attributes: [
ListElement { description: "Tropical" },
ListElement { description: "Seedless" }
]
}
}Der Delegat zeigt alle Obstattribute an:

Component {
id: fruitDelegate
Item {
width: 200; height: 50
Text { id: nameField; text: name }
Text { text: '$' + cost; anchors.left: nameField.right }
Row {
anchors.top: nameField.bottom
spacing: 5
Text { text: "Attributes:" }
Repeater {
model: attributes
Text { text: description }
}
}
}
}Listenmodelle bearbeiten
Der Inhalt eines „ListModel“ kann mithilfe der Methoden „ clear()“, „ append()“, „ set()“, „ insert()“ und „ setProperty()“ erstellt und geändert werden. Beispiel:
Component {
id: fruitDelegate
Item {
width: 200; height: 50
Text { text: name }
Text { text: '$' + cost; anchors.right: parent.right }
// Double the price when clicked.
MouseArea {
anchors.fill: parent
onClicked: fruitModel.setProperty(index, "cost", cost * 2)
}
}
}Beachten Sie, dass bei der dynamischen Erstellung von Inhalten die Menge der verfügbaren Eigenschaften nach ihrer Festlegung nicht mehr geändert werden kann. Es sind ausschließlich die Eigenschaften zulässig, die als Erste dem Modell hinzugefügt wurden.
Verwendung von Threaded-List-Modellen mit WorkerScript
`ListModel` kann zusammen mit ` WorkerScript ` verwendet werden, um von mehreren Threads aus auf ein Listenmodell zuzugreifen. Dies ist nützlich, wenn Listenänderungen synchron erfolgen und einige Zeit in Anspruch nehmen: Die Listenoperationen können in einen anderen Thread verlagert werden, um eine Blockierung des Haupt-GUI-Threads zu vermeiden.
Hier ist ein Beispiel, das „ WorkerScript “ verwendet, um die aktuelle Uhrzeit in regelmäßigen Abständen an ein Listenmodell anzuhängen:
Timer {
id: timer
interval: 2000; repeat: true
running: true
triggeredOnStart: true
onTriggered: {
var msg = {'action': 'appendCurrentTime', 'model': listModel};
worker.sendMessage(msg);
}
}Die eingebundene Datei „ dataloader.mjs “ sieht wie folgt aus:
WorkerScript.onMessage = function(msg) {
if (msg.action == 'appendCurrentTime') {
var data = {'time': new Date().toTimeString()};
msg.model.append(data);
msg.model.sync(); // updates the changes to the list
}
}Der Timer im Hauptbeispiel sendet Nachrichten an das Worker-Skript, indem er ` WorkerScript::sendMessage()` aufruft. Wenn diese Nachricht empfangen wird, wird ` WorkerScript.onMessage() ` in ` dataloader.mjs` aufgerufen, wodurch die aktuelle Uhrzeit an das Listenmodell angehängt wird.
Beachten Sie den Aufruf von ` sync()` aus dem externen Thread. Sie müssen ` sync()` aufrufen, da sonst die in diesem Thread an der Liste vorgenommenen Änderungen nicht im Listenmodell des Hauptthreads übernommen werden.
Siehe auch „Datenmodelle“ und Qt Qml.
Dokumentation zu Eigenschaften
count : int [read-only]
Die Anzahl der Dateneinträge im Modell.
dynamicRoles : bool
Standardmäßig wird der Typ einer Rolle bei ihrer ersten Verwendung festgelegt. Wenn Sie beispielsweise eine Rolle namens „data“ erstellen und ihr eine Zahl zuweisen, können Sie der Rolle „data“ keine Zeichenfolge mehr zuweisen. Ist die Eigenschaft „dynamicRoles“ jedoch aktiviert, ist der Typ einer bestimmten Rolle nicht festgelegt und kann sich von Element zu Element unterscheiden.
Die Eigenschaft „dynamicRoles“ muss festgelegt werden, bevor Daten zum „ ListModel “ hinzugefügt werden, und muss vom Hauptthread aus festgelegt werden.
Bei einem „ ListModel “, dessen Daten statisch definiert sind (über die QML-Syntax „ ListElement “), kann die Eigenschaft „dynamicRoles“ nicht aktiviert werden.
Die Verwendung eines „ ListModel “ mit aktivierten dynamischen Rollen ist mit erheblichen Leistungseinbußen verbunden. Der Leistungsaufwand variiert je nach Plattform, liegt jedoch in der Regel bei einer 4- bis 6-fachen Verlangsamung im Vergleich zur Verwendung statischer Rollentypen.
Aufgrund der Leistungsbeeinträchtigung bei der Verwendung dynamischer Rollen sind diese standardmäßig deaktiviert.
Methodendokumentation
void append(jsobject dict)
Fügt am Ende des Listenmodells ein neues Element hinzu, dessen Werte in „ dict “ enthalten sind.
fruitModel.append({"cost": 5.95, "name":"Pizza"})Siehe auch „ set()“ und „ remove()“.
void clear()
Löscht den gesamten Inhalt aus dem Modell. Insbesondere werden dadurch alle Objekte ungültig, die Sie möglicherweise mit „ get()“ abgerufen haben.
Siehe auch append(), remove() und get().
var get(int index)
Gibt das Element unter „ index “ im Listenmodell zurück. Auf diese Weise kann über JavaScript auf die Elementdaten zugegriffen oder diese geändert werden:
Component.onCompleted: {
fruitModel.append({"cost": 5.95, "name":"Jackfruit"});
console.log(fruitModel.get(0).cost);
fruitModel.get(0).cost = 10.95;
}index muss ein Element in der Liste sein.
Beachten Sie, dass Eigenschaften des zurückgegebenen Objekts, die selbst Objekte sind, ebenfalls Modelle darstellen, und dass diese get()-Methode zum Zugriff auf Elemente verwendet wird:
fruitModel.append(..., "attributes":
[{"name":"spikes","value":"7mm"},
{"name":"color","value":"green"}]);
fruitModel.get(0).attributes.get(1).value; // == "green"Warnung: Es ist nicht garantiert, dassdas zurückgegebene Objekt gültig bleibt. Es sollte nicht in Eigenschaftsbindungen oder zum Speichern von Daten über Änderungen an seinem Ursprungs- ListModel hinweg verwendet werden.
Siehe auch ` append()` und ` clear()`.
void insert(int index, jsobject dict)
Fügt dem Listenmodell an der Position index ein neues Element hinzu, dessen Werte in dict enthalten sind.
fruitModel.insert(2, {"cost": 5.95, "name":"Pizza"})index muss auf ein vorhandenes Element in der Liste verweisen oder auf ein Element, das sich hinter dem Ende der Liste befindet (entspricht dem Hinzufügen am Ende).
Siehe auch „ set()“ und „ append()“.
void move(int from, int to, int n)
Verschiebt die Elemente „ n “ from um eine Position to eine andere.
Die Bereiche „from“ und „to“ müssen vorhanden sein; um beispielsweise die ersten 3 Elemente an das Ende der Liste zu verschieben:
fruitModel.move(0, fruitModel.count - 3, 3)Siehe auch ` append()`.
void remove(int index, int count = 1)
Löscht count Anzahl von Elementen unter index aus dem Modell.
Siehe auch clear().
void set(int index, jsobject dict)
Ändert das Element unter index im Listenmodell mit den Werten aus dict. Eigenschaften, die nicht in dict aufgeführt sind, bleiben unverändert.
fruitModel.set(3, {"cost": 5.95, "name":"Pizza"})Wenn index gleich count() ist, wird ein neues Element an die Liste angehängt. Andernfalls muss index ein Element der Liste sein.
Siehe auch append().
void setProperty(int index, string property, var value)
Ändert den „ property “ des Elements unter index im Listenmodell in value.
fruitModel.setProperty(3, "cost", 5.95)Die „ index “ muss ein Element der Liste sein.
Siehe auch ` append()`.
void sync()
Schreibt alle nicht gespeicherten Änderungen in das Listenmodell, nachdem dieses durch ein Worker-Skript geändert wurde.
© 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.