Как получить доступ к функциям 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, и нет никакого выбора типа, поэтому я не уверен, что делать. Любые предложения приветствуются!
Спасибо!
Джек
Ответы
Ответ 1
Код http://comments.gmane.org/gmane.comp.lib.qt.qml/1778 должен работать, хотя я вижу ошибки, если свойство называется "данные"; похоже, что он переопределяет существующее встроенное свойство. Переименование его в '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 в исходном сообщении не работал, потому что он пытался ссылаться на текстовое свойство внутри вашего делегата, которого не было.)
Что касается ссылки на model vs modelData внутри делегата, разница зависит от типа модели, а не от количества ролей в модели. Если модель представляет собой список строк или список объектов, modelData используется для ссылки на отдельную строку или объект из делегата (поскольку списки строк и списки объектов не имеют каких-либо ролей). Для всех других моделей, включая QML ListModel и Qt С++ QAbstractItemModel, model.role можно использовать для ссылки на роль в делегате.
Ответ 2
Вы можете получить доступ к модели напрямую, используя что-то вроде
Text { text: myModel[myId.currentIndex].text }
Ответ 3
Вы можете получить доступ к элементу ListElement ListModel с помощью функции get().
Text { text: myModel.get(myId.currentIndex).text }