Get index of the delegate currently displayed - QML ListView

前端 未结 4 1018
无人共我
无人共我 2021-02-20 03:03

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 decid

相关标签:
4条回答
  • 2021-02-20 03:16

    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.

    0 讨论(0)
  • 2021-02-20 03:20

    You can use attached properties of ListView class (ListView). They are attached to each instance of the delegate.

    See ListView.isCurrentItem or ListView.view example:

    
        ListView {
            width: 180; height: 200
    
            Component {
                id: contactsDelegate
                Rectangle {
                    id: wrapper
                    width: 180
                    height: contactInfo.height
                    color: ListView.isCurrentItem ? "black" : "red"
                    Text {
                        id: contactInfo
                        text: name + ": " + number
                        color: wrapper.ListView.isCurrentItem ? "red" : "black"
                    }
                }
            }
    
            model: ContactModel {}
            delegate: contactsDelegate
            focus: true
        }
    
    
    0 讨论(0)
  • 2021-02-20 03:22

    You can do like that:

    QModelIndex index =this->indexAt(event->pos());
            this ->setCurrentIndex(index);
    
    0 讨论(0)
  • 2021-02-20 03:24

    I know this is quite old but I had the same problem and spend some time trying to find a way to get currentIndex that would work for me. In my case sometimes I need to change the width of my ListView so I have to recalculte currentIndex manualy every time I resize it.

    But I found a highlightRangeMode property. When it's set to ListView.StrictlyEnforceRange then currentIndex is always updated automaticly and contains correct index of the currently visible item.

    ListView {
        highlightRangeMode: ListView.StrictlyEnforceRange 
        // ...
    }
    
    0 讨论(0)
提交回复
热议问题