QML ListView, странный переход при переходе от второго последнего индекса к последнему индексу, когда определен нижний колонтитул - PullRequest
0 голосов
/ 23 марта 2020

В 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. Но только на последнем элементе, основанном на регистрации.

...