В QML ListView, в Qt 5.5.1, есть некоторое странное поведение при нажатии ↓ со второй по счету currentIndex
списка с contentHeight > height
- но только когда определено footer
:
С нижним колонтитулом:
property int rowHeight: 80
ListView {
width: 320
height: 320
contentHeight: rowHeight * listOfTenItems.count // 80px * 10 = 800px
footer: Item { height: 100 }
model: listOfTenItems
delegate: MyRow {
width: parent.width
height: rowHeight
}
}
Если вы прокрутите вниз до currentIndex
8, а затем нажмете ↓ , то случится так, что список сначала пойдет вниз, но затем внезапно останавливается и ползет обратно. После добавления некоторого contentY
ведения журнала, кажется, что например. index 7 -> index 8, журналы довольно гладкие, такие как:
contentY = 600.123
contentY = 602.2222
contentY = 613.001
contentY = 625.958
contentY = 635.12314
contentY = 640
Но, исходя из индекса 8 -> index 9, журналы выглядят иначе, чем все другие переходы. Что-то вроде:
contentY = 719
contentY = 719.99598
contentY = 719.99998
contentY = 719.99998
contentY = 719.99998 // That is, almost no "slide" in Y
contentY = 720
Если я уберу footer
, то такого «прыжка» никогда не произойдет, и прокрутка вверх / вниз с помощью клавиатуры перемещается плавно без «странного» поведения:
property int rowHeight: 80
ListView {
width: 320
height: 320
contentHeight: rowHeight * listOfTenItems.count // 80px * 10 = 800px
model: listOfTenItems
delegate: MyRow {
width: parent.width
height: rowHeight
}
}
Журналы будут, например,
contentY = 690.10051
contentY = 692.99598
contentY = 702.24998
contentY = 713.5555
contentY = 717.99998
contentY = 720
Конечно, проблема сейчас в том, что в списке нет нижнего колонтитула, и при использовании щелчка содержимое останавливается до конца последнего делегата.
Я также пытался использовать например. preferredHighlightBegin = 240
с highlightRangeMode
и ListView.StrictlyEnforceRange
и ListView.ApplyRange
, но, похоже, они не влияют на "скачок".
Я подозреваю, что когда вы достигнете последнего индекса, он не сделать просто contentY = currentIndex * delegate.height
(так сказать), а что-то вроде: contentY = currentIndex * delegate.height + footer.height
. Но только на последнем элементе, основанном на регистрации.