Repeater Model可以执行JAVASCRIPT吗?

时间:2017-09-14 15:36:07

标签: javascript xml qt qml repeater

我在QML中有一个XmlListModel

XmlListModel {
 id: model
 source: "qrc:/Config/myConfig.xml"
 query: "/levels/level"
 XmlRole { name: "levName"; query: "@levName/string()" }
 XmlRole { name: "from"; query: "from/number()" }
 XmlRole { name: "to"; query: "to/number()" }
}

读取此XML文件

<levels parId = "3">
 <level levelName = "level1">
  <from>0</from>
  <to>1</to
 </level>
 <level levelName = "level2">
  <from>1</from>
  <to>2</to>
 </level>
</levels>

我还有一个文本元素:

Text {
    id: myText
    x: 0; y:0
    text: ""
}

我需要遍历XmlListModel,以便根据我在myText.text中找到的内容myList.get(3).value分配myList,其中ListModel是{ {1}}。

例:
如果myList.get(3).value介于0(已包含)和1之间(已排除),则必须设置myText.text = "level1",如果它位于1(已包含)和{{之间1}}(已排除)我必须设置2,依此类推......

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

很遗憾,您无法像give me the value, where x is between role from and role to那样在XmlListModel中查询您的XmlListModel。

对您有好处,您有一个有序列表,因此您可以在O(log n)上执行二进制搜索。算法基本上是这样的:

首先检查您的搜索值是否与中间的搜索值重合。如果它较小,则在下半部分的中间搜索,如果它较大,则在上半部分搜索......依此类推。
有了这个,您可以在n中找到自己的价值,其中XmlListModelText { text: binarySearch(model, myList.get(3).value).levName } 中的条目数。
https://docs.unity3d.com/ScriptReference/Material.SetFloat.html

如果您已实现此功能,则可以使用JavaScript或C ++或Python来处理您的模型......您可以这样:

for(int x=0;x<mapX;x++){
for(int y=mapY-1;y>-1;y--){
    try{
       if(map[x][y] instanceof LightSource)
                    lightmap[x][y]=19;
       else{
          else{
                if(x-1>-1&&lightmap[x][y]<lightmap[x-1][y])
                     lightmap[x][y]=lightmap[x-1][y]-map[x][y].translucency;
                if(x+1<lv.map.length-1&&lightmap[x][y]<lightmap[x+1][y])
                     lightmap[x][y]=lightmap[x+1][y]-map[x][y].translucency;
                if(y+1<lv.map[0].length-1&&lightmap[x][y]<lightmap[x][y+1])
                     lightmap[x][y]=lightmap[x][y+1]-map[x][y].translucency;
                if(y-1>0&&lightmap[x][y]<lightmap[x][y-1])
                     lightmap[x][y]=lightmap[x][y-1]-map[x][y].translucency;
            }
      }
  }catch(Exception e){}
}
}

实施此算法时,请务必处理差距。