Как получить доступ к ролям currentItem из списка в 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.text в исходном сообщении не работал, потому что он пытался сослаться на текстовое свойство в вашем делегате, которого не было.)
Что касается ссылки на модель против modelData в делегате, разница зависит от типа модели, а не от количества ролей в модели. Если модель представляет собой список строк или список объектов, modelData используется для ссылки на отдельную строку или объект внутри делегата (поскольку списки строк и списки объектов не имеют каких-либо ролей). Для всех других моделей, включая QML ListModel и Qt C++ QAbstractItemModel, model.role может использоваться для ссылки на роль в делегате.
В качестве альтернативы вы можете получить прямой доступ к модели, например
Text { text: myModel[myId.currentIndex].text }
Вы можете получить доступ к ListElement ListModel, используя функцию get().
Text { text: myModel.get(myId.currentIndex).text }