Как изменить модель на основе состояния в QML
Вопрос
Я пытаюсь создать словарное приложение на основе QML.Он извлекает определение слова через XML RESTful API и отображает его в ListView.У меня он работает в этом элементарном режиме.Но теперь я пытаюсь реализовать два состояния для ListView:стандартный вид с определениями и списком вариантов типа «вы имели в виду» на случай, если поиск не удался.
Мой текущий код для ListView выглядит следующим образом:
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
}
что дает эту ошибку:
Unable to assign QObject* to QDeclarativeComponent*
для PropertyChanges
декларация.Существует также цикл привязки, но это не проблема, которую я не смог бы исправить.Моя проблема в том, как мне определить состояния.Я также не могу создать экземпляр модели и делегата внутри объявления State, поскольку интерпретатор будет жаловаться на создание объекта, специфичного для состояния.
Решение
ПредложениеЕселегию существует создание. Свойство делегата требует компонента, который он будет создан для каждого отображения каждого элемента. Итак, для предоставления компонента, а не экземпляра, необходимого, необходимо обернуть предложениеDelegate в компоненте и использовать идентификатор компонента в PropertyChanges:
Component {
id: suggestionDelegate
SuggestionDelegate { }
}
Другие советы
Хотя решение Мартина устранило мою проблему, я придумал лучший дизайн пользовательского интерфейса.Поскольку представления определений и предложений являются взаимоисключающими, я реализовал каждое из них как отдельный элемент, который имеет одинаковую геометрию и отображается или скрывается в зависимости от текущего состояния.Это также позволяет создавать красивую анимацию перехода.