Search code examples
qtlistlistviewqml

Get index of the delegate currently displayed - QML ListView


I created a ListView, which displays a couple of pages of content defined by the user (plain text). The page displayed is a delegate. Only one page is visible at a time. I decided to use it to get snapping to one item, in the same way the iOS' launcher works. The user simply flicks between the pages. (this is to be used on touch screens)

I need to have the index of the currently displayed page for some operation. currentIndex of the ListView always stays == 0. How can I get it?

For those who prefer code:

 ListView
 {
      onCurrentIndexChanged: console.log(currentIndex) // this gets called only once - at startup
      delegate: Column
      {
           // The page displayed, only one page at a time
      }
 }

Thanks


Solution

  • There are many ways to get the index of current item that is displayed in the screen. If you can get the x-y coordinate of current page, you can use indexAt method in ListView.

    And in each delegate, you can find the index using index role within the scope of the delegate. The index is like a role you declared in your model, and is automatically assigned by ListView. For example,

    ListView 
    {
        delegate: Column
        {
            property int indexOfThisDelegate: index
            //...
        }
    }
    

    The index role is introduced here:

    A special index role containing the index of the item in the model is also available to the delegate. Note this index is set to -1 if the item is removed from the model...

    Another way is to explicitly assign value to the currentItem property in ListView, so the view can scroll by itself. Here is an simple example in Qt documentation, which is similar to your application.