Как получить доступ к ролям 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 }