Ich würde gerne wissen, ob es möglich ist, (mehrere) verschiedene Delegaten für eine QML ListView
zu verwenden.Verschiedene Delegaten für QML ListView
Abhängig von dem einzelnen Objekt im Modell ListView
möchte ich die Objekte mit verschiedenen Delegaten visualisieren.
Dieses Stück Code erklärt, was ich erreichen möchte:
main.qml
import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.2
import QtQuick.Dialogs 1.2
ApplicationWindow {
title: qsTr("Hello World")
width: 640
height: 480
visible: true
ListModel {
id: contactsModel
ListElement {
name: "Bill Smith"
position: "Engineer"
}
ListElement {
name: "John Brown"
position: "Engineer"
}
ListElement {
name: "Sam Wise"
position: "Manager"
}
}
ListView {
id: contactsView
anchors.left: parent.left
anchors.top: parent.top
width: parent.width
height: parent.height
orientation: Qt.Vertical
spacing: 10
model: contactsModel
delegate: {
if (position == "Engineer") return Employee; //<--- depending on condition, load Contact{}
else if (position == "Manager") return Manager; //<--- depending on condition, load Person{}
}
}
}
Employee.qml (Eine mögliche Komponente, die ich als Delegierter verwenden möchten)
import QtQuick 2.4
Rectangle{
width: 200
height: 50
color: ListView.isCurrentItem ? "#003366" : "#585858"
border.color: "gray"
border.width: 1
Text{
anchors.centerIn: parent
color: "white"
text: name
}
}
Manager.qml (andere Komponente, die ich gerne als Delegierter verwenden würde)
import QtQuick 2.4
Rectangle{
width: 200
height: 50
color: "red"
border.color: "blue"
border.width: 1
Text{
anchors.centerIn: parent
color: "white"
text: name
}
}
Ich würde mich über jeden Hinweis freuen! Danke!
In diesem Fall können Sie auch die Erstellung eines eindeutigen 'delegate' berücksichtigen, der' position' in Bindungen verwendet, um seinen Aspekt zu ändern. Andernfalls können Sie einen 'Loader' verwenden, aber Sie müssen einige Informationen an das innere' Element' weiterleiten, d. H. An die echten Delegierten. Auch Folibis Lösung kann funktionieren, aber ich glaube nicht, dass es in diesem Fall so wäre, da "Position" selbst eine Rolle spielt. – BaCaRoZzo
Warum definieren Sie nicht einfach einen 'Delegaten', der sowohl die' Rectangle's als auch das 'visible' Feld auf einer pro' position' Basis enthält? – skypjack