我有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次。有没有聪明的方法可以动态创建这样的属性列表?
答案 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
}
}