Qml XmlListModel有多个SOURCES

时间:2017-08-01 16:54:51

标签: xml qt qml

我有一堆名为&#34; config_1.xml&#34;,&#34; config_2.xml&#34;,&#34; config_3.xml&#34;等的xml文件。< / p>

基本上,我需要从第一个循环到最后一个,在SAME XmlListModel中附加所有&#34; id&#34;我在每个xml文件的查询context / info /参数中找到。

因此,一旦阅读完成,我将获得整个id(s)列表。

我尝试过:

property int myIterator: 1

Repeater {
    model: 10 //10 is just an example. I have this number in my code by other functions.
    XmlListModel {
        id: myModel
        source: "qrc:/ConfigFiles/config_" + myIterator + ".xml" // <---- THIS IS THE PROPERTY I NEED TO PARAMETRIZE!!!
        query: "context/info/parameters"
        XmlRole { name: "myId"; query: "id/number()" }
        onCountChanged: { ++myIterator; }
    }
}

onMyIteratorChanged: {
    if (myIterator> 10)
        for(var i = 0; i<myModel.count; i++) // myModel.count should be equal to 10!!!
            console.log("id: " + myModel.get(i).myId);
}

但是,使用此代码,应用程序崩溃。 我该如何解决?

我还考虑过将每次迭代时存储在myModel中的所有信息传输到ListModel(其中appen()通过文档很容易)的想法。但我仍然不知道如何调用XmlListModel n次......

谢谢!! : - )

1 个答案:

答案 0 :(得分:2)

要根据模型创建多个XmlListModel,您无法使用Repeater,因为XmlListModel不是Item。您必须将Instantiator用于普通QtObject

Repeater类似,您可以使用modelData(或index访问代理中的模型数据,因为我们使用整数,所以它们在这里相同作为模特)。

如果您想迭代所有模型,可以使用countobjectAt()进行迭代:

Instantiator {
    id: instantiator
    model: 10
    delegate: XmlListModel {
        source: "qrc:/ConfigFiles/config_" + (modelData + 1) + ".xml"
        query: "context/info/parameters"
        XmlRole { name: "myId"; query: "id/number()" }
    }
    Component.onCompleted: {
        for (var i = 0; i < instantiator.count; i++) {
            var xmlModel = instantiator.objectAt(i);
            for (var j = 0; i < xmlModel.count; j++)
                console.log("id: " + xmlModel.get(j).myId);
    }
}