Получить индекс отображаемого делегата-QML ListView

Я создал ListView, который отображает пару страниц контента, определенного пользователем (обычный текст). Отображаемая страница является делегатом. Одновременно видна только одна страница. Я решил использовать его для привязки к одному элементу, так же, как работает пусковая установка iOS. Пользователь просто щелкает между страницами. (это должно использоваться на сенсорных экранах)

Мне нужно иметь индекс текущей отображаемой страницы для некоторой операции. currentIndex ListView всегда остается == 0. Как можно я возьму?

для тех, кто предпочитает код:

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

спасибо

4 ответов


есть много способов, чтобы получить индекс текущего элемента, который отображается на экране. Если вы можете получить координату x-y текущей страницы, вы можете использовать indexAt метод в ListView.

и в каждом делегате вы можете найти индекс, используя index роль в области делегата. The index похоже на роль, объявленную в вашей модели, и автоматически назначается ListView. Например,

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

на роль здесь:

делегату также доступна специальная роль индекса, содержащая индекс элемента в модели. Примечание этот показатель имеет значение -1, если элемент удаляется из модели...

другой способ-явно назначить значение currentItem свойство в ListView, поэтому представление может прокручиваться само по себе. Вот простой пример в документации Qt, которая похожа на ваше приложение.


вы можете использовать вложенные свойства класса ListView (ListView). Они прикрепляются к каждому экземпляру делегата.

См. ListView.isCurrentItem или ListView.пример:


    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
    }


Я знаю, что это довольно старый, но у меня была та же проблема и потратить некоторое время, пытаясь найти способ получить currentIndex это сработало бы для меня. В моем случае мне нужно изменить ширину моего ListView поэтому мне пришлось recalculte currentIndex вручную каждый раз.

но потом я нашел highlightRangeMode собственность. Когда он установлен в ListView.StrictlyEnforceRange затем currentIndex всегда обновляется автоматически и содержит правильную индекс текущего видимого элемента.

ListView {
    highlightRangeMode: ListView.StrictlyEnforceRange 
    // ...
}

вы можете сделать так:

QModelIndex index =this->indexAt(event->pos());
        this ->setCurrentIndex(index);