如何滚动到Flickable的中继器中的最后一项

时间:2016-09-03 14:50:44

标签: qt qml qtquick2

我有一个Flickable,其中包含两个Repeaters列布局。我希望滚动到第一个转发器中的最后一项。这可能吗?

我想有一种方法可以计算第一个转发器中有多少项,然后将它乘以我正在使用的代表的高度。 (代表是一个固定的高度。)或者取转发器的高度并减去最后一个代表的高度。等等......虽然我希望比这更好。

import QtQuick 2.7
import QtQuick.Controls 2.0

Item {
    id:passwordsView
    Flickable {
        id: flickable1
        anchors.fill: parent
        contentHeight: passwordsView_column.height
        ScrollBar.vertical: ScrollBar { }
        Column {
            id:passwordsView_column
            spacing: 15
            anchors.left: parent.left
            anchors.right: parent.right
            Repeater {
                id: passwordsView_breadcrumb
                anchors.left: parent.left
                anchors.right: parent.right
                model: BreadcrumbModel {}
                delegate: PasswordFolderDelegate {
                    y: 8;
                    anchors.left: parent.left;
                    anchors.right: parent.right;
                }
            }

            Repeater {
                id: passwordsView_contents
                model: PasswordModel {}
                PasswordFolderDelegate {
                    y: 8
                    anchors.left: parent.left
                    anchors.right: parent.right
                }
                anchors.left: parent.left
                anchors.right: parent.right
            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

  

或者取转发器的高度并减去最后一个代表的高度。

Repeater没有高度,因为它只是放置物品,所以这可能有点困难。

我能想到的最简单的方法是使用mapToItem()

import QtQuick 2.7
import QtQuick.Controls 2.0

ApplicationWindow {
    width: 400
    height: 400
    visible: true

    Flickable {
        id: flickable1
        anchors.fill: parent
        contentHeight: passwordsView_column.height
        ScrollBar.vertical: ScrollBar { }
        Column {
            id:passwordsView_column
            spacing: 15
            anchors.left: parent.left
            anchors.right: parent.right
            Repeater {
                id: passwordsView_breadcrumb
                anchors.left: parent.left
                anchors.right: parent.right
                model: 10
                delegate: Rectangle {
                    width: 50
                    height: 50
                    color: "transparent"
                    border.color: "salmon"

                    Text {
                        text: index
                        anchors.centerIn: parent
                    }
                }
            }

            Repeater {
                id: passwordsView_contents
                model: 10
                delegate: Rectangle {
                    width: 50
                    height: 50
                    color: "transparent"
                    border.color: "#444"

                    Text {
                        text: index
                        anchors.centerIn: parent
                    }
                }
            }
        }
    }

    Button {
        text: "Position at end"
        anchors.top: parent.top
        anchors.right: parent.right
        onClicked: {
            var lastItem = passwordsView_breadcrumb.itemAt(passwordsView_breadcrumb.count - 1);
            flickable1.contentY = lastItem.mapToItem(flickable1.contentItem, 0, 0).y
        }
    }
}

请注意,这会使视图立即移动。如果你想要平滑滚动,你可能不得不以某种方式计算所需的速度并将其传递给flick()