如何在循环中初始化qml属性列表?

时间:2015-10-31 08:57:16

标签: javascript qt qml qtquick2

我有qml list属性:

Item {
    property list<SomeItem> items: [
        SomeItem { num: 0 },
        SomeItem { num: 1 },
        SomeItem { num: 2 },
        ...
        SomeItem { num: 100 }
    ]

是否可以更巧妙地初始化它?例如。在某种程度上像下面的代码?

Item {
    property list<SomeItem> items

    ...

    Component.onCompleted: {
        for(var i = 0; i < 100; i++)
            ??? // items.append( SomeItem {num: i})
    }
}

编辑:对不起,我实际上想要更改用于初始化其他属性的自定义属性(num):

SomeItem {
    property int num: 0

    key: getKey(num)
    name: getName(num)

    function getKey(num) {
        return ...
    }

    function getName(num) {
        return ...
    }
}

编辑2(根据 Mitch ddriver 答案): 我想使用Repeater,但是我必须初始化由某个外部库提供的list属性。

我一直在使用SomeItem属性初始化num,因为key属性必须是唯一的而不是null。但是,假设我可以通过在num方法中设置onCompleted来解决这个问题:

Item {
    property list<SomeItem> items: [
        SomeItem { },
        SomeItem { },
        SomeItem { },
        ...
        SomeItem { }
    ]

    ...

    Component.onCompleted: {
        for(var i = 0; i < items.length; i++)
            items[i].num = i
    }
}

所以主要问题是我必须添加SomeItem {},行100次。有没有聪明的方法可以动态创建这样的属性列表?

2 个答案:

答案 0 :(得分:2)

没有

documentation for list描述了它的使用方式:

  

可以通过与JavaScript数组类似的方式访问列表值:

     
      
  • 使用[]方括号语法以逗号分隔值
  • 分配值   
  • length属性提供列表中的项目数
  •   
  • 使用[index]语法
  • 访问列表中的值   

您最好使用Repeater

Repeater {
    model: 100

    delegate: SomeItem {
        num: index
    }
}

答案 1 :(得分:0)

你尝试做的事情毫无意义。而且完全是多余的。而且不可能。

id属性不是字符串,也不是数字。

在您的特定情况下,您希望数字ID等于列表中每个对象的索引,除了不可能之外也是不必要的。相反,您可以使用items[index]轻松访问每个对象。

如果由于某种原因你真的需要分配和使用动态标识符,你可以使用JS对象,这将允许你进行字符串键查找而不是整数索引:

    Item {        
        property var lookup: new Object

        Component {
            id: test

            QtObject {
                property string name
            }
        }

        Component.onCompleted: {
            lookup["John"] = test.createObject(null, { "name" : "JohnDoe" })
            lookup["Jane"] = test.createObject(null, { "name" : "JaneDoe" })

            console.log(lookup["John"].name) // outputs JohnDoe
            console.log(lookup["Jane"].name) // outputs JaneDoe
        }
    }