2017-09-14 7 views
0

J'ai un XmlListModel dans QMLLe modèle Répéteur peut-il exécuter JAVASCRIPT?

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()" } 
} 

qui lit ce fichier 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> 

J'ai aussi un élément de texte:

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

je dois itérer le XmlListModel pour d'attribuer au myText.text le bon niveau sur la base de ce que j'ai trouvé dans myList.get(3).value, où myList est un ListModel.

Exemple:
si myList.get(3).value est compris entre 0 (inclus) et 1 (exclu) je mettre myText.text = "level1", si elle est comprise entre 1 (inclus) et 2 (exclu) je mettre myText.text = "level2", et ainsi de suite. ..

Une suggestion?

+1

Je ne comprends pas vraiment ce qu'est le 'XmlListModel', le' ListModel' et où votre 'Repeater' pourrait être ... Mais vous pouvez avoir JavaScript dans la liaison de la propriété' text', comme ceci: 'text:" level "+ (Math.floor (myList.get (3) .value) + 1)' – derM

+0

J'ai besoin du XmlListModel 'car je ne veux pas afficher directement la valeur d'un paramètre, mais son niveau correspondant (que je trouve dans le fichier XML). Donc, la solution que vous avez fournie ne fonctionne pas pour moi .. – Elena

+1

quelle sera la valeur de 'myText.text'? Quelles sont les choses que vous pouvez vous assurer au sujet de votre fichier XML (comme: sont les parties 'from' et' to' toujours '1', et toujours de type' int' sont-ils dans le bon ordre? Sont-ils continus? Donc je peux être bien sûr, que 'model.get (n)' me donne l'entrée pour la plage de 'n' à' n + 1'? – derM

Répondre

0

Malheureusement, vous ne pouvez pas interroger votre XmlListModel dans O(1) comme give me the value, where x is between role from and role to.

Bon pour vous, vous avez une liste ordonnée, de sorte que vous pouvez effectuer une recherche binaire sur votre XmlListModel. L'algorithme fonctionne essentiellement comme ceci:

Vous vérifiez d'abord si votre valeur de recherche est par coïncidence celle du milieu. Si elle est plus petite, vous cherchez au milieu de la moitié inférieure, si elle est plus grande, vous cherchez dans la moitié supérieure ... et ainsi de suite.
Avec cela, vous pouvez trouver votre valeur dans O(log n)n est le nombre d'entrées dans votre XmlListModel.
https://en.wikipedia.org/wiki/Binary_search_algorithm

Si vous avez cette mise en œuvre, pour travailler sur votre modèle - soit en JavaScript ou en C++ ou Python ... vous pouvez l'avoir comme ceci:

Text { 
    text: binarySearch(model, myList.get(3).value).levName 
} 

Lorsque vous implémentez cet algorithme, assurez-vous de faire face aux lacunes.

+0

Merci beaucoup pour la suggestion :-))) – Elena