Получить индекс отображаемого делегата-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);