Ich verwende QtQuick 2.0 und QML ListView, das ich mit meinem Modell in C++ (eine QList von Objekten) verbunden habe. Die Verbindung wurde über QQmlContext::setContextProperty() hergestellt.
Jetzt hat mir die Dokumentation gesagt, dass es keinen direkten Weg für die Oberfläche gibt, über Änderungen informiert zu werden, also habe ich den Kontext nur aktualisiert, wann immer ich mein Modell geändert habe. Wenn ich dies jedoch tue, wird die Ansicht direkt aktualisiert, ohne ein Ereignis auszulösen (wie z.B. add oder remove Ereignisse), was mich ein wenig stört, da ich keine Kontrolle über die Übergänge habe.
Um es einfach auszudrücken, hier ist mein QML-Code:
ListView {
id : list
boundsBehavior: Flickable.StopAtBounds
anchors {
top: titleBar.bottom
topMargin: -1
bottom: mainWindow.bottom
bottomMargin: -1
}
width: mainWindow.width
model: episodes
delegate: Episode {
id: myDelegate
onShowClicked: episodes.append(episodes[index])
}
ScrollBar {
flickable: list;
}
}
wo Episode mein benutzerdefinierter Delegat ist. Es enthält den folgenden Code:
ListView.onAdd: SequentialAnimation {
PropertyAction { target: episodeDelegate; property: "height"; value: 0 }
NumberAnimation { target: episodeDelegate; property: "height"; to: 80; duration: 250; easing.type: Easing.InOutQuad }
}
ListView.onRemove: SequentialAnimation {
PropertyAction { target: episodeDelegate; property: "height"; value: true }
NumberAnimation { target: episodeDelegate; property: "height"; to: 0; duration: 250; easing.type: Easing.InOutQuad }
// Stellen Sie sicher, dass delayRemove wieder auf false gesetzt wird, damit das Element zerstört werden kann
PropertyAction { target: episodeDelegate; property: "delayRemove"; value: false }
}
was eine direkte Kopie von Qt Beispielen ist.
Zusammenfassend ist das Modell korrekt verknüpft und synchronisiert, jedoch verhindert die Art und Weise, wie dies geschieht, dass ich die Art der Modelländerungen in meiner QML-Logik kenne.
Weiß jemand einen Trick?