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