listview roles qml qabstractlistmodel

listview - ¿Cómo accede a los roles del elemento actual desde una vista de lista en QML?



qabstractlistmodel (3)

Alternativamente, podría acceder al modelo directamente, con algo como

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

Estoy tratando de acceder a un rol desde un ListView en QML. Esencialmente, tengo esto en mi QML:

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

myModel es una implementación de QAbstractListModel. La parte QML de esto es un componente reutilizable, por lo que el modelo podría tener cualquier número de roles diferentes con varios tipos de datos. Lo que me gustaría hacer es vincular al valor de un rol dado de la propiedad currentItem de ListView. En otras palabras, me gustaría tener algún otro Component en la página que pueda vincular una propiedad al elemento seleccionado actualmente en el ListView de la siguiente manera:

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

Tenga en cuenta que necesito que este genérico esté disponible, ya que lo haré mucho para varios tipos de modelos e intento no escribir ese tipo de código personalizado para cada modelo y ListView.

Parece que debería ser sencillo acceder a una propiedad del artículo seleccionado actualmente, pero por lo que puedo decir 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 un rol. Con esto quiero decir que a veces accedes a tus roles a través de model.roleName mientras que cuando solo hay un rol, usas 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 intento usar los datos en mis scripts QML, y no hay una conversión de tipos disponible, así que no estoy seguro de qué hacer. Cualquier sugerencia es bienvenida!

¡Gracias!

Jack


El código en http://comments.gmane.org/gmane.comp.lib.qt.qml/1778 debería funcionar, aunque veo errores si la propiedad se llama ''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ódigo myId.currentItem.text en la publicación original no funcionó porque estaba tratando de referirse a una propiedad de texto dentro de su delegado, que no existía).

En lo que respecta a referirse a model vs modelData dentro del delegado, la diferencia depende del tipo de modelo, en lugar de la cantidad de roles en el modelo. Si el modelo es una lista de cadenas o una lista de objetos, modelData se usa para referirse a la cadena u objeto individual desde dentro de un delegado (ya que las listas de cadenas y de objetos no tienen ningún rol). Para todos los demás modelos, incluidos QML ListModel y Qt C ++ QAbstractItemModel, model.role se puede usar para referirse a un rol dentro de un delegado.


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

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