Ja, es ist möglich von QAbstractlistmodel abgeleitet werden. Es ist einfach nicht möglich, einen ListModel
mit einem anderen ListModel
zu erstellen. Zumindest ist es in QML nicht möglich.
Hier ist schnell und schmutzig Beispiel, wie man es macht. Löst es dein Problem?
import QtQuick 2.4
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.1
import QtQuick.Controls.Styles 1.4
import QtQuick.Window 2.2
Window {
visible: true
width: 640
height: 480
ListModel {
id: listModel
ListElement {slmIndex: 0}
ListElement {slmIndex: 1}
ListElement {slmIndex: 2}
ListElement {slmIndex: 3}
ListElement {slmIndex: 4}
ListElement {slmIndex: 5}
}
ListModel {
id: model1
ListElement { name: "1" }
}
ListModel {
id: model2
ListElement { name: "1" }
ListElement { name: "2" }
}
ListModel {
id: model3
ListElement { name: "1" }
ListElement { name: "2" }
ListElement { name: "3" }
}
ListModel {
id: model4
ListElement { name: "1" }
ListElement { name: "2" }
ListElement { name: "3" }
ListElement { name: "4" }
}
ListModel {
id: model5
ListElement { name: "1" }
ListElement { name: "2" }
ListElement { name: "3" }
ListElement { name: "4" }
ListElement { name: "5" }
}
ListModel {
id: model6
ListElement { name: "1" }
ListElement { name: "2" }
ListElement { name: "3" }
ListElement { name: "4" }
ListElement { name: "5" }
ListElement { name: "6" }
}
property var secondLayerModels: [
model1, model2, model3, model4, model5, model6
]
ListView {
anchors.centerIn: parent
width: 200
height: 200
clip: true
model: listModel
orientation: ListView.Vertical
delegate: ListView {
width: 200
height: 50
model: secondLayerModels[slmIndex]
orientation: ListView.Horizontal
delegate: Rectangle {
width: 50
height: 50
border.color: "black"
Text {
anchors.fill: parent
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
text: name
}
}
}
}
}
Ich bin nicht sicher, ob diese Antwort vollständig die Frage abdeckt. Es behandelt nicht, wie ein C++ - Modell erstellt wird, das weitere Modelle verfügbar macht.
Das Verschachteln von 'ListModels' ist möglich über' attributes', siehe [hier] (http://stackoverflow.com/a/34358794/2538363) und verwandte Links. Das heißt, es scheint mir, dass das Verschachteln von Modellen eine unnötige Addition von Komplexität ist. Ich würde die C++ - Modelle registrieren und sie dann in einer benutzerdefinierten Ansicht mit 'Flickable' +' Repeater' verwenden. In einer dynamischeren Einstellung, z.B. Wenn sich die C++ - Modelle drastisch ändern können, wäre es gut, eine eindeutige Klasse zu haben, die die Anzahl der Modelle aufdeckt und ihnen Zugriff gewährt. Nur meine zwei Cent. – BaCaRoZzo
@Filip Hallo, das Problem ist, dass ich nicht weiß, wie viele Modelle ich haben werde - das hängt von einigen Daten in C++ ab. Ich weiß, dass es möglich ist, ListElement zu ListModel hinzuzufügen, aber ich kann keine geeignete Methode zum Erstellen von N ListModels finden und dann Elemente zu jedem Modell hinzufügen. Im Beispiel haben Sie 6 Modelle mit der Eigenschaft var secondLayerModels fest codiert. ## BaCaRoZzo: Ich habe versucht, mit Listview innerhalb Repeater und es funktioniert auch gut mit Array von Modellen und jedes Modell wegen Index zu bekommen. Weißt du etwas über das, was ich Filip gefragt habe? Es scheint ein einfaches Problem zu sein, aber ich kann die Lösung nicht erreichen. – iTwo