2016-08-22 1 views
0

У меня есть QML ListView, что я данных вождения делегатов с помощью массива JavaScript:Какую 'модель' я получаю в своем делегате ListView?

ListView { 
    id:mylist 
    model: [ {...}, {...}, {...} ] // JS objects 
    delegate: MyRow { mydata: mylist.model[index] } 
} 

Приведенный выше код работает правильно. Код, который я изначально написал не работает, как ожидалось, однако:

ListView { 
    model: [ {...}, {...}, {...} ] // JS objects 
    delegate: MyRow { mydata: model[index] } 
} 

MyRow.qml просто прямоугольник с настраиваемого свойства и некоторые Уложенные из детей:

Rectangle { 
    property var mydata 
    color:'#eeeeff'; height:20 
    RowLayout { 
     anchors.fill:parent 
     Text { ... } 
     Text { ... } 
    } 
} 

Когда я прошу model внутри MyRow делегат, что я получаю? Это не массив, к которому можно получить доступ по адресу index, а также не к объекту со свойствами, которые я хочу.


Edit: Если я назначу model+"" в свойстве строки в моем делегатом, я получаю QQmlDMListAccessorData(0x13aee00).

+0

Как показано в приложении к [этот отчет об ошибке] (https://bugreports.qt.io/browse/QTBUG-49983), лучше всего использовать 'modelData' вместо' mylist.model [index ] '. – Phrogz

ответ

1

Цитирование Models and Views in Qt Quick:

Если есть именование столкновение свойств модели и свойств делегата, роли могут быть доступны с квалифицированным модели именем вместо этого. Например, если тип текста имел тип или возраст свойства, текст в приведенном выше примере будет отображать эти значения свойства вместо типа и возрастных значения из элемента модели. В этом случае на свойствах можно было ссылаться как model.type и model.age, чтобы гарантировать, что делегат отображает значения свойств из элемента модели.

Итак, model является аксессуаром для названных ролей модели. Если у вас нет именованных ролей, например, если модель представляет собой число или массив JS, Qt не может придумать имя; вместо этого вам предоставляются данные через modelData. Другими словами, model не полезен, когда ваша модель не имеет названных ролей.

+0

Эта документация подразумевает, что 'ListView {model: [{x: 'Hello'}, {x: 'World'}]; делегат: MyRow {mydata: model.x}} 'должен работать; но вместо этого я получаю 'Невозможно назначить [undefined] в QString' (с' свойство string mydata' в 'MyRow'). Это может быть [ошибка] (https://bugreports.qt.io/browse/QTBUG-49983), о которой я упоминал выше. – Phrogz

+0

Это массив JS, а не модель с именованными ролями, поэтому вместо этого вы должны использовать 'modelData'. – jpnurmi

+0

Да, это массив JS. (Это всегда было в вопросе.) Я также вижу в документации, что 'modelData' должен использоваться, когда ~" у модели нет названных ролей ". Однако это не объясняет, что такое «модель». – Phrogz