2012-03-19 9 views
6

Esencialmente, tengo una ListView habitual:¿Cómo acceder a los datos de un delegado asignado de ListElement de ListView ListModel en QML?

Rectangle { 
    id: mylist 

    ListModel { 
     id: mylistModel 
     ListElement { 
      text: "blah1" 
     } 
     ListElement { 
      text: "blah2" 
     } 
     ListElement { 
      text: "blah3" 
     } 
    } 

    Component { 
     id: mylistDelegate 

     Text { 
      id: mylistDelegateText 
      text: text 
      property bool mylistDelegateTextEnabled: false 
     } 
    } 

    ListView { 
     id: mylistView 
     model: mylistModel 
     delegate: mylistDelegate 
    } 
} 

por favor, ignora cualquier problema que podría haber introducido truncando el código para centrarse en lo importante.

De todos modos, ahora mi problema es que quiero acceder a un delegado asignado de ListElement y ver cuál es el valor de mylistDelegateTextEnabled en un bucle de javascript. Por ejemplo, este bucle itera sobre la lista actual y me da el texto de las ListElements en el modelo:

for(var i = 0; i < mylistModel.count; ++i) { 
    console.log(mylistModel.get(i).text); 
} 

Obviamente, esto funciona bien.

Ahora lo que quiero es esencialmente la siguiente:

for(var i = 0; i < mylistModel.count; ++i) { 
    console.log(mylistModel.get(i).text); 
    console.log(mylistModel.get(i).delegate.mylistDelegateTextEnabled); 
} 

Por desgracia, que no parece ser tan fácil.

Ayuda apreciada.

Respuesta

5

No se puede acceder a los delegados de esa manera porque son objetos transitorios que se crean y destruyen a discreción del ListView. Como se explica en el documentation para los delegados:

Delegates are instantiated as needed and may be destroyed at any time. State should never be stored in a delegate.

¿Hay alguna razón particular por la que no se puede simplemente añadir una bandera textEnabled a la ListModel? Por ejemplo:

import QtQuick 1.0 

Rectangle { 
    id: mylist 
    width:300 
    height:300 

    ListModel { 
     id: mylistModel 
     ListElement { 
      name: "blah1" 
      textEnabled:false 
     } 
     ListElement { 
      name: "blah2" 
      textEnabled:false 
     } 
     ListElement { 
      name: "blah3" 
      textEnabled:false 
     } 
    } 

    Component { 
     id: mylistDelegate 

     Text { 
      id: mylistDelegateText 
      text: name 
      color: textEnabled?"red":"black" 


      MouseArea { 
       anchors.fill:parent; 
       onClicked: { 
        mylistModel.setProperty(index, "textEnabled", !textEnabled); 
       } 
      } 
     } 
    } 

    ListView { 
     id: mylistView 
     model: mylistModel 
     delegate: mylistDelegate 
     width:100; 
     height:100 

    }  
} 
+0

¡Gracias por la respuesta! Intenté y obtengo un error: no puedo asignar a la propiedad de solo lectura "textEnabled". Sí, me gustaría asignar desde QML en lugar de JS. ¿Puedo hacer eso? – Svenstaro

+1

Creo que por el error está tratando de configurar el indicador 'textEnabled' dentro del delegado que no funcionará. En su lugar, actualice el modelo directamente usando 'model.setProperty()'. Actualizaré mi respuesta para demostrarlo de esta manera en lugar de usar 'Component.onCompleted'. –

+0

Eso es perfecto, gracias. – Svenstaro

2

probar este código: -

for (var i = 0; i < mylistView.count; i ++) { 
 
     // this will get list item at index i 
 
     console.log(mylistView.contentItem.children[i]); 
 

 
     // lets set it height to 100 
 
     mylistView.contentItem.children[i].height=100; 
 
    }

Espero que esto ayude, aplausos !!! @navi

Cuestiones relacionadas