如何将QML ScrollView滚动到中心?

时间:2015-05-20 19:59:01

标签: qt qml qtquick2

我有这样的代码:

ScrollView {
    Image {
        source: "..."
    }
}

Image高于ScrollView。如何将后者滚动到Image

的中心位置

3 个答案:

答案 0 :(得分:10)

尽管有外观,ScrollViewFlickable紧密相关。实际上,Flickable用于控制可见区域。这样的Item可用作(readonly)属性flickableItemFlickable具有contentXcontentY属性来控制当前可见区域。这些属性可以与width的{​​{1}}和height结合使用,将可见区域精确定位在中心位置。通常你有:

ScrollView

差异是必要的,因为第一次调用只是将中心移动到可见区域的左上角flickableItem.contentY = flickableItem.contentHeight / 2 - height / 2 flickableItem.contentX = flickableItem.contentWidth / 2 - width / 2 / contentX所在的位置)。

以下是contentY作为主要子级Image的完整示例。

免责声明 在示例提出的简单方案中,使用remotelly加载的图像,在调用ScrollView时仍可以取消设置大小,导致中心代码无法正常工作。通过将宽度和高度直接设置为代码,可以避免问题。在实际情况下,这样的细节应该是不必要的。

onCompleted

答案 1 :(得分:2)

从Qt 5.14开始(也许在5.12版本中),您现在可以轻松进行操作:

ScrollView {
    Component.onCompleted {
        // scroll to vertical center
        ScrollBar.vertical.position = 0.5
    }

    // put your content item here:
    Image {
        // …
    }
}

答案 2 :(得分:1)

这是QQC2的解决方案。在Qt 5.12上进行了测试。

解决方案很简单,只需存储scrollBar指针并根据需要控制它即可。

ScrollView2.qml

import QtQuick 2.0
import QtQuick.Controls 2.4

ScrollView {
    id: root
    property ScrollBar hScrollBar: ScrollBar.horizontal
    property ScrollBar vScrollBar: ScrollBar.vertical

    /**
     * @param type [Qt.Horizontal, Qt.Vertical]
     * @param ratio 1.0 to 1.0
     */
    function scrollTo(type, ratio) {
        var scrollFunc = function (bar, ratio) {
            bar.setPosition(ratio - bar.size/2)
        }
        switch(type) {
        case Qt.Horizontal:
            scrollFunc(root.hScrollBar, ratio)
            break;
        case Qt.Vertical:
            scrollFunc(root.vScrollBar, ratio)
            break;
        }
    }
}

main.qml

import QtQuick 2.12
import QtQuick.Window 2.12

Window {
    visible: true
    width: 500
    height: 500
    ScrollView2 {
        id: scroll
        anchors.fill: parent
        Text {
            width: 1000
            height: 1000
            text: "ABC"
            font.pixelSize: 800
            Component.onCompleted: {
                scroll.scrollTo(Qt.Horizontal, 0.5)
                scroll.scrollTo(Qt.Vertical, 0.5)
            }
        }
    }
}