我有:
MyItem.qml
import QtQuick 2.0
Item {
property string info1: "info"
property int info2: 1
}
如何在初始化过程中将项目添加到数组qml?
正在工作:
import QtQuick 2.0
Item {
property var arr: [{ info1: "test", info2: 1}, { info1: "info" }]
}
但是,这不起作用:
import QtQuick 2.0
Item {
property var arr: [MyItem { info1: "test", info2: 1}, MyItem { info1: "info" }]
}
答案 0 :(得分:0)
您可以尝试使用Dynamic QML Object Creation:
import QtQuick 2.0
Item {
property var arr: {
component = Qt.createComponent("MyItem.qml");
item1 = component.createObject(null, {"info1": "test", "info2": 1});
item2 = component.createObject(null, {"info1": "info"});
return [item1, item2];
}
}
有关更多信息,请参见Qt.createComponent
和createObject
。
答案 1 :(得分:0)
如果使用较新的QML版本,则可以对属性使用新的list<Item>
类型。在那里,您可以轻松地以所需的语法添加“项目”,例如使用property alias someProperty: someItem.somePropertyList (e.g. children)
时。
include QtQuick 2.10 // I think 2.9 is sufficient
ApplicationWindow {
...
property list<Item> myItemList: [
Item { Component.onCreated: console.log(parent) }, // parent will be null! Set it explicitly if needed.
Item {},
Item {},
...
]
}
http://doc.qt.io/qt-5/qml-list.html
文档中的小注释:
注意:不建议将列表类型用作自定义属性的类型。为此,应改用var类型,因为可以在QML中更灵活地操作var类型存储的列表。
恕我直言,只要您不需要“更大的灵活性”,您就可以忽略它
在较旧的版本中,这是不可能的,但是如果您使用的是“ ArrayObject.qml”类型,则可以尝试破解
import QtQuick 2.0
QtObject {
id: root
default property QtObject store
readonly property var arr: (arr === undefined ? [] : arr) // This will give you a binding loop, but ensures that after filling the array, it is not reset to [].
onStoreChanged: {
if (store) {
console.log(store)
arr[arr.length] = store
console.log(arr, arr.length)
}
store = null
}
}
然后可以使用它:
ArrayObject {
id: tst
Item {
}
Item {
}
Item {
}
}
当然,可能还有其他解决方法。
例如:
Item {
property var myArray: [
itemId1, itemId2, itemId3, itemId4
]
Item { id: itemId1 }
...
}