Chciałbym wiedzieć, czy możliwe jest użycie (kilku) różnych delegatów dla QML ListView
.Różni delegaci dla QML ListView
W zależności od pojedynczego obiektu w modelu ListView
, chciałbym wizualizować obiekty z różnymi delegatami.
Ten fragment kodu wyjaśnia, co chcę osiągnąć:
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 (Jednym z możliwych komponentów, które chciałbym użyć jako delegat)
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 (inny komponent, którego chciałbym użyć jako delegata)
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
}
}
Byłbym wdzięczny za radę! Dzięki!
W tym przypadku można również rozważyć utworzenie unikalnego 'delegata', który używa' position' w wiązaniach, aby zmienić jego aspekt. W przeciwnym razie możesz użyć 'Loader', ale musisz przekazać pewne informacje do wewnętrznego' item', tzn. Prawdziwych delegatów. Również rozwiązanie Folibis może działać, ale nie sądzę, aby tak było w tym przypadku, ponieważ "pozycja" sama w sobie jest rolą. – BaCaRoZzo
Dlaczego po prostu nie zdefiniujesz 'delegata' zawierającego zarówno' Rectangle's i ustawić ich 'visible' pole na podstawie' position'? – skypjack