Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you access the roles of the currentItem from a listview in QML?

Tags:

I'm trying to access a role from a ListView in QML. Essentially, I have this in my QML:

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

myModel is a QAbstractListModel implementation. The QML portion of this is a reusable component, so the model could have any number of different roles with various data types. What I would like to do is bind to the value of a given role of the currentItem property of the ListView. In other words, I'd like to have some other Component on the page that could bind a property to the currently selected item in the ListView as follows:

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

Please keep in mind that I need this generically available, as I'll be doing this a lot for a number of model types and I'm trying not to write that kind of custom code for each model and ListView.

It seems like it should be simple to access a property of the currently selected item, but as far as I can tell it is not possible. The problem is complicated further by the fact that models appear to be treated differently when there is only one role. By this I mean that sometimes you access your roles via model.roleName whereas when there is only one role you use modelData.

If anybody has any suggestions, I would truly appreciate it. Thanks so much!

EDIT

I found this:

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

However, this doesn't appear to work for me. I'm getting type errors when I try to use the data in my QML scripts, and there is no type casting available so I'm not sure what to do. Any suggestions are welcome!

Thanks!

Jack

like image 967
Jack Benson Avatar asked Mar 08 '11 11:03

Jack Benson


People also ask

What is ListView in QML?

A ListView displays data from models created from built-in QML types like ListModel. A ListView has a model, which defines the data to be displayed, and a delegate, which defines how the data should be displayed. Items in a ListView are laid out horizontally or vertically.

What is Modeldata in QML?

Similarly, encapsulating an instance of the data in a delegate allows the developer to dictate how to present or handle the data. Model - contains the data and its structure. There are several QML types for creating models. View - a container that displays the data. The view might display the data in a list or a grid.


2 Answers

The code at http://comments.gmane.org/gmane.comp.lib.qt.qml/1778 should work, although I do see errors if the property is named 'data'; it looks like it is overriding some existing built-in property. Renaming it to 'myData' seems to work:

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 } 

(The myId.currentItem.text code in the original post didn't work because this was trying to refer to a text property within your delegate, which didn't exist.)

In regards to referring to model vs modelData within the delegate, the difference depends on the type of the model, rather than the number of roles in the model. If the model is a string list or object list, modelData is used to refer to the individual string or object from within a delegate (since string lists and object lists do not have any roles). For all other models, including the QML ListModel and the Qt C++ QAbstractItemModel, model.role can be used to refer to a role within a delegate.

like image 196
blam Avatar answered Oct 07 '22 18:10

blam


You could alternatively access the model directly, with something like

Text { text: myModel[myId.currentIndex].text } 
like image 31
Henry Haverinen Avatar answered Oct 07 '22 20:10

Henry Haverinen