具有ID的Qml中继器

时间:2019-03-22 23:05:38

标签: qt qml

如果编写了以下代码:

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

如何为所有10个矩形赋予不同的ID?

2 个答案:

答案 0 :(得分:3)

您不能分配其他ID,而且ID的范围是委托,限制范围是:如果要访问某项,则必须使用itemAt()方法传递索引:

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

// ...

var item = repeater.itemAt(2)

答案 1 :(得分:3)

根据您想做什么,您可以

A。从索引中访问项目

您可以使用转发器的itemAt方法访问元素的索引,如@eyllanesc所示。请小心,因为可能尚未实例化代表。

    Repeater { 
        id: repeater
        model: 5

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

        Rectangle { /*...*/ }
   }

B。使用itemAdded信号

您可以连接到Repeater的{​​{3}}信号。每当添加一个项目时(当然)就会触发该信号,并将提供项目indexitem

    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。但这总是取决于!