如何将项目添加到数组qml?

时间:2018-10-11 13:11:26

标签: qt qml

我有:

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" }]
}

2 个答案:

答案 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.createComponentcreateObject

答案 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 }
    ...
}