Wie man zustandsbasierte Modellwechsel in QML machen
Frage
Ich versuche, eine QML-basierte Wörterbuch-Anwendung zu machen. Es holt die Wortdefinition über ein XML-RESTful API und zeigt sie in einem Listview. Ich habe es in diesem rudimentären Modus arbeiten. Aber jetzt versuche ich zwei Staaten für das Listview zu implementieren. Standardansicht mit den Definitionen und eine „Meinten Sie“ Art Vorschlagsliste für, wenn die Suche fehlgeschlagen
Mein aktueller Code für das Listview ist wie folgt aus:
ListView
{
SuggestionModel{id:suggestionModel; currentWord : "test"}
SuggestionDelegate{id:suggestionDelegate}
model : XmlModel{id: standardModel; currentWord : "test"}
delegate : ListDelegate{id:standardDelegate}
clip : true
anchors.top : hbox.bottom
y : hbox.height + 3
width : parent.width
height : parent.height - hbox.height
id : list
states :
State { name: "suggestion"; when: list.model == suggestionModel ||
list.model.status == XmlListModel.Ready && list.count == 0
PropertyChanges {
target: list
model : suggestionModel
delegate : suggestionDelegate
}
}
focus : true
keyNavigationWraps : true
}
, die diesen Fehler gibt:
Unable to assign QObject* to QDeclarativeComponent*
für die PropertyChanges
Erklärung. Es gibt auch eine Bindungsschleife, aber das ist nicht wirklich ein Problem kann ich nicht fix. Mein Problem ist, wie kann ich die Zustände definieren. Ich kann nicht das Modell instanziiert und in der Staats Erklärung entweder als Dolmetscher übertragen wird beschweren sich über eine zustandsspezifische Objekt zu erzeugen.
Lösung
SuggestionDelegate instanziiert wird. Die Delegierten Eigenschaft erfordert eine Komponente, die es sich für jedes Element instanziiert wird es anzeigt. So eine Komponente zur Verfügung zu stellen, anstatt eine Instanz müssen Sie die SuggestionDelegate in einer Komponente wickeln und die Komponenten-ID in dem Property verwenden:
Component {
id: suggestionDelegate
SuggestionDelegate { }
}
Andere Tipps
Obwohl Martin-Lösung das Problem behebt ich mit war, kam ich mit einem besseren Design für die Benutzeroberfläche auf. Da die Definitionen und Vorschläge sind sich gegenseitig ausschließende sehen, implementiert ich jeweils als eigene Position, die die gleiche Geometrie aufweisen und entsprechend dem aktuellen Zustand angezeigt oder ausgeblendet. Dies ermöglicht auch schöne Übergang Animationen.