2017-08-01 40 views
1

我確實有一堆名爲「config_1.xml」,「config_2.xml」,「config_3.xml」等的xml文件。Qml具有多個SOURCES的XmlListModel

基本上,我需要從第一個循環到最後一個,在SAME XmlListModel中追加在每個xml文件的查詢上下文/ info /參數中找到的所有「id」。

所以,一旦閱讀完成,我會有整個id列表。

我嘗試:

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

'myModel'的類型是XmlListModel'的'對象的標識符。你必須明白'myModel'不是數組,而是指向對象實例的「指針」。但是'Repeater'是你的情況中的一種數組。所以你可以通過索引使用'Repeater.itemAt(index)' – folibis

+0

@folibis來訪問你的對象,我的觀點是Repeater需要一個Item類型的委託,而不是一個模型。所以我正在尋找一種替代解決方案。怎樣纔能有n XmlListModel? – Elena

+1

用'Instantiator' – GrecKo

回答

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); 
    } 
} 
+0

謝謝@GrecKo – Elena