Где определено свойство index, так как Repeater используется для создания экземпляра массива элементов, каждый из которых может получить доступ к индексу - PullRequest
0 голосов
/ 19 декабря 2018

Полагаю, index является вложенным свойством, но где оно определено и почему доступ к index отличается от ListView.isCurrentItem?

Из официальной документации, описание делегата свойства Repeater :

Делегатам предоставляется свойство индекса только для чтения, которое указывает индекс делегата в ретрансляторе.

Я в замешательстве.Почему делегатам предоставляется свойство и с помощью какой операции это происходит?

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

index не является вложенным свойством, это свойство контекста.

Поскольку Repeater сам создает экземпляры делегатов, при этом он может предоставлять собственный контекст.

ВВ этом контексте у вас есть index, свойство для каждой роли вашей модели (или modelData, если это модель без ролей) и свойство объекта model, содержащее все ранее упомянутые свойства.Объект model предназначен для доступа к другим свойствам с более точным именем, чтобы избежать затенения.Например, если ваша исходная модель имеет роль text, а ваш делегат имеет свойство text, выполнение text: text не будет очень далеко.Чтобы решить эту проблему, вы можете сделать text: model.text.

Подводя итог, ваш делегат имеет доступ к следующим свойствам контекста:

Для модели без ролей (QStringList, QObjectList, JSмассив, целое число, ...):

  • index
  • modelData
  • model
    • .index
    • .modelData

Для модели с ролями (c ++ QAbstractListModel, ListModel, ...):

  • index
  • role1
  • role2
  • ...
  • model
    • .index
    • .role1
    • .role2
    • ...

Почему ListView использует прикрепленныйсвойства, такие как ListView.isCurrentItem, а не свойства контекста, объясняются тем, что ListView напрямую не создает экземпляры своих делегатов.Он использует QQmlDelegateModel внутри (Repeater тоже использует его).Это QQmlDelegateModel, который предоставляет свойства индекса и контекста роли, но он не знает о ListView специфических свойствах, поэтому ListView должен впоследствии предоставлять их через прикрепленные свойства.

0 голосов
/ 19 декабря 2018

Свойство index является обычным свойством, которое может использоваться в делегате и будет отличаться при каждом повторении делегата (на Repeater, ListView и многие другие)

СИмея это в виду, вы можете делать удобные вещи, такие как выделение текущего элемента:

ListView {
    id: list
    model: 5 //instantiate the delegate 5 times

    delegate: Button {
        highlighted: list.currentIndex == index

        onClicked: list.currentIndex = index
    }
}
...