Qml Repeater с идентификаторами - PullRequest
2 голосов
/ 23 марта 2019

Если написал следующий код:

Repeater { model: 10; 
delegate: Rectangle { width: 200; height:           
20; color: "white";}}

Как я могу дать всем 10 прямоугольникам разные идентификаторы?

Ответы [ 2 ]

3 голосов
/ 23 марта 2019

В зависимости от того, что вы хотите сделать, вы можете либо

A.Доступ к элементу из его индекса

Вы можете получить доступ к элементам по их индексу, используя метод ретранслятора itemAt, как указано @eyllanesc.Будьте осторожны, поскольку делегаты еще не могут быть созданы.

    Repeater { 
        id: repeater
        model: 5

        Component.onCompleted: {
            if (repeater.count > 0) {
                var firstRect = repeater.itemAt(0)
                // do something
            }
        }

        Rectangle { /*...*/ }
   }

B.Используйте itemAdded сигнал

Вы можете подключиться к itemAdded сигналу Repeater.Этот сигнал срабатывает всякий раз, когда элемент добавляется (конечно), и будет предоставлять элемент index и item.

    Repeater { 
        id: repeater
        model: 5

        property Item firstRect

        onItemAdded: {
            // `index` and `item` come from the signal
            if (index == 0) {
                firstRect = item
                // Or do something with item
            }
        }

        Rectangle { /*...*/ }
    }

C.Делегат назначает себя свойству

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

    Repeater { 
        id: repeater
        model: 5

        // That property can be anywhere
        property Item firstRect

        Rectangle {
            id: rect
            width: 50; height: 50;
            Component.onCompleted: { 
                // Index is automatically populated by the Repeater
                if (index == 0)                
                    repeater.firstRect = rect
            }
        }
    }

В большинстве случаев вы хотите избежать какой-либо зависимости от делегатов от родителей,поэтому решения A и B являются предпочтительными.Но это всегда зависит!

3 голосов
/ 23 марта 2019

Вы не можете назначить другой идентификатор, также у идентификатора есть область действия, пределом которой является делегат. Если вы хотите получить доступ к элементу, вы должны использовать метод itemAt(), передающий индекс:

Repeater { 
    id: repeater
    model: 10; 
    delegate: Rectangle { 
        width: 200; 
        height: 20; 
        color: "white";
    }
}

// ...

var item = repeater.itemAt(2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...