Как получить доступ к ролям currentItem из списка в QML? - PullRequest
18 голосов
/ 08 марта 2011

Я пытаюсь получить доступ к роли из 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.

Если у кого-нибудь есть какие-либо предложения, я был бы очень признателен. Большое спасибо!

EDIT

Я нашел это:

http://comments.gmane.org/gmane.comp.lib.qt.qml/1778

Однако, похоже, это не работает для меня. Я получаю ошибки типа, когда пытаюсь использовать данные в моих сценариях QML, и нет никакого приведения типов, поэтому я не уверен, что делать. Любые предложения приветствуются!

Спасибо!

Jack

Ответы [ 3 ]

25 голосов
/ 09 марта 2011

Код в 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 код в исходном сообщении не работал, потому что он пытался обратиться к text свойство в вашем делегате, которого не было.)

Что касается ссылки на модель vs modelData внутри делегата, разницазависит от типа модели, а не от количества ролей в модели.Если модель представляет собой список строк или список объектов, modelData используется для ссылки на отдельную строку или объект внутри делегата (поскольку списки строк и списки объектов не имеют каких-либо ролей).Для всех других моделей, включая QML ListModel и Qt C ++ QAbstractItemModel, model.role может использоваться для ссылки на роль в делегате.

7 голосов
/ 20 мая 2011

Вы также можете напрямую получить доступ к модели, например,

Text { text: myModel[myId.currentIndex].text }
2 голосов
/ 30 августа 2016

Вы можете получить доступ к ListElement ListModel, используя функцию get ().

...