2011-03-08 19 views
16

Estoy intentando acceder a un rol desde un ListView en QML. En esencia, tengo esto en mi QML:¿Cómo accedes a las funciones del elemento actual desde una vista de lista en QML?

ListView { 
    id: myId 
    model: myModel 
    delegate: Item { 
     Text { 
      text: model.text 
     } 
     Text { 
      text: model.moreText 
     } 
    } 
} 

myModel es una aplicación QAbstractListModel. La parte QML de esto es un componente reutilizable, por lo que el modelo podría tener cualquier cantidad de roles diferentes con varios tipos de datos. Lo que me gustaría hacer es vincular el valor de una función determinada de la propiedad currentItem de ListView. En otras palabras, me gustaría tener alguna otra Component en la página que podría obligar a una propiedad del elemento seleccionado actualmente en el ListView de la siguiente manera:

Text { 
    text: myId.currentItem.text // Or myId.currentItem.model.text (or something similar) 
} 

Por favor, tenga en cuenta que necesito esta manera genérica disponible, ya que haré esto mucho para una serie de tipos de modelos y estoy tratando de no escribir ese tipo de código personalizado para cada modelo y ListView.

Parece que debería ser fácil acceder a una propiedad del elemento seleccionado en ese momento, pero hasta donde sé, no es posible. El problema se complica aún más por el hecho de que los modelos parecen ser tratados de manera diferente cuando solo hay una función. Con esto quiero decir que a veces accedes a tus roles a través del model.roleName, mientras que cuando solo hay una función, utilizas modelData.

Si alguien tiene alguna sugerencia, realmente lo agradecería. ¡Muchas gracias!

EDITAR

encontré esto:

http://comments.gmane.org/gmane.comp.lib.qt.qml/1778

Sin embargo, esto no parece funcionar para mí. Recibo errores de tipo cuando trato de usar los datos en mis scripts QML, y no hay ningún tipo de conversión disponible, así que no estoy seguro de qué hacer. Cualquier sugerencia es bienvenida!

Gracias!

Jack

Respuesta

19

El código en http://comments.gmane.org/gmane.comp.lib.qt.qml/1778 debería funcionar, aunque sí veo errores si la propiedad se denomina 'datos'; parece que está anulando alguna propiedad incorporada existente. Cambiar el nombre a 'myData' parece funcionar:

ListView { 
    id: myId 
    model: myModel 
    delegate: Item { 
     property variant myData: model 
     Text { 
      text: model.text 
     } 
     Text { 
      text: model.moreText 
     }  
    } 
} 

Text { text: myId.currentItem.myData.text } 

(El códigomyId.currentItem.text en el post original no funcionó porque esto estaba tratando de hacer referencia a un texto propiedad dentro de su delegado , que no existía.)

en lo que respecta a la referencia al modelo de vs ModelData dentro del delegado, la diferencia depende del tipo de modelo, más que el número de funciones en el modelo. Si el modelo es una lista de cadenas o una lista de objetos, modelData se utiliza para referirse a la cadena u objeto individual dentro de un delegado (ya que las listas de cadenas y las listas de objetos no tienen ningún rol). Para todos los demás modelos, incluido QML ListModel y Qt C++ QAbstractItemModel, model.role se puede utilizar para referirse a un rol dentro de un delegado.

+0

¡Muchísimas gracias por su respuesta! Hmm ... pensé que lo intenté exhaustivamente, pero puede haber algunos matices que me he perdido. ¡Es bueno saber que está funcionando para alguien! Volveré a dar una solución a esta solución y veré si funciona bien. Aprecio la aclaración entre model.role y modelData. Te dejaré saber cómo van las cosas. ¡Gracias de nuevo! –

+1

Parece que funciona. No estoy seguro de lo que me había perdido antes. De cualquier manera, esta solución llevó horas encontrarla, así que con suerte ahora que está en StackOverflow, otras personas podrán encontrarla rápidamente. ¡Gracias de nuevo! –

+0

¿Hay alguna forma de abstraer sobre los diferentes tipos de modelos? Pregunto porque me gustaría manejar un QML ListModel durante las pruebas y una lista de objetos en la aplicación C++ usando el mismo código QML. – ssc

7

Se podría, alternativamente, tener acceso al modelo directamente, con algo como

Text { text: myModel[myId.currentIndex].text } 
+0

Esto no parece funcionar: TypeError: No se puede leer la propiedad 'texto' de indefinido –

1

Puede acceder a una ListElement de ListModel usando la función get().

Text { text: myModel.get(myId.currentIndex).text } 
+0

¿Podría elaborar más su respuesta agregando un poco más de descripción acerca de la solución que proporciona? – abarisone

+1

@abarisone myModel es el modelo que proporcionará a ListView y myId es listView y el texto es un rol. Por ejemplo 'ListModel { Identificación: myModel ListElement { texto: "Apple" coste: 2,45 } ListElement { texto: "Orange" coste: 3,25 } ListElement { texto: "banana" coste : 1,95 }} ListView { id: myId anchors.fill: padres modelo: myModel delegado: texto {text: texto}} ' –

+0

¿este supone que funciona incluso si el modelo se define en C++? Porque parece que no puedo hacer que funcione. Dice que la propiedad get no está definida. – Savvas

Cuestiones relacionadas