Как получить доступ к ролям currentItem из listview в QML?
Я пытаюсь получить доступ к роли из ListView в QML. По сути, у меня есть это в моем QML:
ListView {
id: myId
model: myModel
delegate: Item {
Text {
text: model.text
}
Text {
text: model.moreText
}
}
}
myModel
является реализацией QAbstractListModel. Часть QML этого является повторно используемым компонентом, поэтому модель может иметь любое количество различных ролей с различными типами данных. То, что я хотел бы сделать, это привязать к значению данной роли currentItem
свойство ListView. Другими словами, Я хотел бы иметь какой-то другой Component
на странице, которая может связать свойство для текущего выбранного элемента в ListView выглядит следующим образом:
Text {
text: myId.currentItem.text // Or myId.currentItem.model.text (or something similar)
}
пожалуйста, имейте в виду, что мне нужно это в целом доступно, так как я буду делать это много для ряда типов моделей, и я пытаюсь не писать такой пользовательский код для каждой модели и ListView.
кажется, что должно быть просто получить доступ к свойству выбранного элемента, но, насколько я могу судить, это невозможно. Проблема осложняется еще и тем, что модели, по-видимому, обрабатываются по-разному, когда есть только одна роль. Под этим я подразумеваю, что иногда вы получаете доступ к своим ролям через model.roleName
тогда как, когда есть только одна роль, вы используете modelData
.
если у кого-нибудь есть предложения, я был бы очень признателен. Большое спасибо!
редактировать
Я нашел вот это:
http://comments.gmane.org/gmane.comp.lib.qt.qml/1778
однако это, похоже, не работает для меня. Я получаю ошибки типа при попытке использовать данные в моих сценариях QML, и нет никакого кастинга типов, поэтому я не уверен, что делать. Любые предложения приветствуются!
спасибо!
Джек
3 ответов
код в http://comments.gmane.org/gmane.comp.lib.qt.qml/1778 должен работать, хотя я вижу ошибки, если свойство называется "data"; похоже, что оно переопределяет некоторое существующее встроенное свойство. Переименование его в "myData", похоже, работает:
ListView {
id: myId
model: myModel
delegate: Item {
property variant myData: model
Text {
text: model.text
}
Text {
text: model.moreText
}
}
}
Text { text: myId.currentItem.myData.text }
(между myId.currentItem.текст код в исходном сообщении не работал, потому что это пыталось ссылаться на текст свойство в вашем делегате, которое не существовать.)
в отношении ссылки на модель vs modelData внутри делегата разница зависит от типа модели, а не от количества ролей в модели. Если модель является списком строк или списком объектов, modelData используется для ссылки на отдельную строку или объект из делегата (поскольку списки строк и списки объектов не имеют ролей). Для всех других моделей, включая QML ListModel и Qt C++ Помощью переопределенной QAbstractItemModel, модель.роль может использоваться для ссылки на роль в делегате.
вы можете также получить доступ к модели напрямую, с чем-то вроде
Text { text: myModel[myId.currentIndex].text }
вы можете получить доступ к ListElement ListModel с помощью функции get ().
Text { text: myModel.get(myId.currentIndex).text }