可滑动滚动条位置始终初始化为零

问题描述 投票:0回答:1

对于无法提供工作示例提前表示歉意。

我有一个 QML Flickable,其组件是一个中继器,可生成一列垂直的单选按钮。 我了解 Flickable 的默认行为是将其滚动条位置设置为零。 我想做的是以编程方式向下滚动到当前选中的单选按钮。 问题是,每次我将 ScrollBar.position 或属性 Flickable.contentY 设置为除零以外的任何值时,它都会立即设置回零。

初始化完成后,我可以通过编程方式控制滚动条,没有问题。 然而,这不是我需要的。

我尝试通过在回调 Component.onCompleted 中为可轻拂、滚动条、父级和父级的父级设置位置/contentY 值来移动 ScrollBar,但没有成功。 下面基本上是我如何设置 Flickable 的。 再次,我很抱歉无法提供有效的示例。

Rectangle
{
  anchors.fill: parent
  property var fileNames: []

  onFileNamesChanged:
  {
    repeater.model = fileNames
  }

  Flickable
  {
    id: flickable
    anchors.fill: parent
    clip: true

    ScrollBar.veritical: ScrollBar
    {
      parent: flickable.parent
      anchors.top: flickable.top
      anchors.left: flickable.left
      anchors.bottom: flickable.bottom
      anchors.leftMargin: 4

      contentItem: Rectangle
      {
        radius: 5
        implicitWidth: 5
        color: "grey"
      }
    }
    Column
    {
      id: flickableColumn
      width: parent.width
      spacing: 5

      Repeater
      {
        id: repeater
        delegate: Column
        {
          id: delegateColumn
          width: flickableColumn.width
          spacing: flickableColumn.spacing

          RadioButton {/** some stuff **/}
          Rectangle{/** set up as a divider bar **/}
        }
      }
   }
}

我在 ScrollBar 的 onPositionChanged 回调中设置了一个 console.log 命令。 最后两个日志是: 更改滚动条位置 0.18181818181818183 // <-- Correct position

更改滚动条位置 0

qml
1个回答
0
投票

一些改进:

  • 使用 Frame 代替外部的 Rectangle,这样就可以减少锚定逻辑
  • 使用ListView代替Flickable + Column + Repeater(做同样的事情)
  • Qt.CallLater
    与 Component.onCompleted 结合使用以实现延迟初始化
    Frame {
        anchors.fill: parent
        ListView {
            id: listView
            anchors.fill: parent
            model: "abcdefghijklmopqrstuvwxyz".split("").map(ch => `filename-${ch}.txt`)
            clip: true
            delegate: ItemDelegate { text: modelData }
            ScrollBar.vertical: ScrollBar { width: 20; policy: ScrollBar.AlwaysOn }
            Component.onCompleted: Qt.callLater( () => contentY = 50 )
        }
    }

您可以在线尝试!

© www.soinside.com 2019 - 2024. All rights reserved.