Qt QML如何滚动回到ListView标头?

时间:2019-06-24 00:16:40

标签: qt listview qml qt5

如果我在ListView中选择一个带有标题的项目,我希望列表以简短的动画向上滚动,以将当前选定的项目放置在列表的顶部,并且标题向上移动并且不可见。这适用于以下代码。但是,当我想向下滚动以再次看到列表标题时,它总是会跳回到列表的顶部(第一项)。这很可能是由highlightRangeMode: ListView.StrictlyEnforceRange引起的。但是我该如何避免呢?

我尝试过highlightRangeMode: ListView.ApplyRange,它使我再次滚动到标题,但是这导致项目通常不会移到顶部,这是不可接受的。 我尝试了headerPositioning: ListView.PullBackHeader,但给了我与headerPositioning: ListView.PullBackHeader

相同的结果
ListView {
    id: list
    anchors.fill: parent
    clip: true
    spacing: 11
    focus: true
    highlightMoveDuration: 400
    snapMode: ListView.SnapToItem
    preferredHighlightBegin: 0
    preferredHighlightEnd: 100
    highlightRangeMode: ListView.StrictlyEnforceRange

    headerPositioning: ListView.InlineHeader
    header: Rectangle {
                id: headerBar
                height: 116
                color: "blue"
                anchors {
                    left: parent.left
                    right: parent.right
                    leftMargin: 12
                    rightMargin: 12
                }
            }

    model: myModel

    delegate: ListItem {
                  height: 56
                  width: list.width
                  color: "red"
                  onListItemClicked: {
                      list.currentIndex = index
                  }
              }
}

我希望ListView中的选定项始终滚动到列表顶部(在preferredHighlightBeginpreferredHighlightEnd内部),并且我可以手动向下滚动以查看ListView标头。有人知道解决方案吗?

由于我不想使用滚动条,因此在How can I animate scrolling in a QML ScrollView?中看不到解决方案。

1 个答案:

答案 0 :(得分:1)

您只能在点击时应用严格的范围,然后将其删除以使鼠标平滑滚动:

ListView {
    // ....
    highlightRangeMode: ListView.NoHighlightRange

    delegate: ListItem {
        // ...
        onListItemClicked: {
            list.highlightRangeMode = ListView.StrictlyEnforceRange
            list.currentIndex = index
            list.highlightRangeMode = ListView.ApplyRange
        }
    }
}