是否有一种方法来使用striclyenforcerange不同大小的委托?



用于问题说明的代码示例:

import QtQuick 2.15
ListView {
model: 10
highlightRangeMode: ListView.StrictlyEnforceRange
preferredHighlightBegin: width / 2 - currentItem.width / 2
preferredHighlightEnd: width / 2 + currentItem.width / 2
orientation: Qt.Horizontal
snapMode: ListView.SnapToItem
spacing: 15
delegate: Rectangle {
width: index === 5 ? 150 : 50
height: 50
}
}

定位视图在任何其他索引有平滑的动画过渡,因为它应该,但当设置为5(这是不同大小的委托),它只是捕捉到它没有动画。是ListView本身的问题吗?有解决办法吗?

在您的代码中,preferredHighlightBeginpreferredHighlightEnd的位置是根据当前项目的宽度计算的。当当前项更改为具有不同宽度的项时,突出显示矩形的位置也需要更新以反映新宽度。

一种解决方案可能是,您可以根据项目的总宽度计算preferredHighlightBeginpreferredHighlightEnd的位置,直到并包括当前项目。这样,每当前面任何项的宽度发生变化时,突出显示矩形的位置就会更新。下面的代码可能会有所帮助:

import QtQuick 2.15
ListView {
model: 10
highlightRangeMode: ListView.StrictlyEnforceRange
orientation: Qt.Horizontal
snapMode: ListView.SnapToItem
spacing: 15
delegate: Rectangle {
width: index === 5 ? 150 : 50
height: 50
}
Component.onCompleted: {
var totalWidth = 0
for (var i = 0; i <= currentIndex; i++) {
totalWidth += visualItemModel.get(i).width
}
preferredHighlightBegin = width / 2 - totalWidth + visualItemModel.get(currentIndex).width / 2
preferredHighlightEnd = width / 2 - totalWidth + visualItemModel.get(currentIndex).width / 2
}
onCurrentIndexChanged: {
var totalWidth = 0
for (var i = 0; i <= currentIndex; i++) {
totalWidth += visualItemModel.get(i).width
}
preferredHighlightBegin = width / 2 - totalWidth + visualItemModel.get(currentIndex).width / 2
preferredHighlightEnd = width / 2 - totalWidth + visualItemModel.get(currentIndex).width / 2
}
}

相关内容

  • 没有找到相关文章