如何将QML ScrollView滚动到中心?

fhd*_*sYa 6 qt qml qtquick2

我有这样的代码:

ScrollView {
    Image {
        source: "..."
    }
}
Run Code Online (Sandbox Code Playgroud)

Image高于ScrollView.如何将后者滚动到中心位置Image

BaC*_*Zzo 11

尽管外表,ScrollView与之密切相关Flickable.实际上,Flickable用于控制可见区域.这样的Item可用作(readonly)属性flickableItem.FlickablecontentXcontentY属性来控制当前可见区域.这些性质可与被组合widthheightScrollView至可视区域准确地在中心位置.通常你有:

flickableItem.contentY = flickableItem.contentHeight / 2 - height / 2
flickableItem.contentX = flickableItem.contentWidth / 2 - width / 2
Run Code Online (Sandbox Code Playgroud)

差异是必要的,因为第一次调用只是将中心移动到可见区域的左上角(位于contentX/ contentY所在的位置).

这是一个完整的例子,有一个Image主要的孩子ScrollView.

免责声明:在示例提出的简单场景中,使用remotelly加载的图像,onCompleted调用时仍然可以取消设置大小,从而导致中心代码不起作用.通过将宽度和高度直接设置为代码,可以避免问题.在实际情况中,这样的细节应该是不必要的.

import QtQuick 2.4
import QtQuick.Window 2.2
import QtQuick.Controls 1.2

Window {
    id: main
    visible: true
    width: 600; height: 350

    ScrollView {
        id: ss
        width: 600
        height: 350

        Image {
            id: name
            width: 900
            height: 600
            source: "http://www.joomlaworks.net/images/demos/galleries/abstract/7.jpg"
        }

        Component.onCompleted: {
            flickableItem.contentY = flickableItem.contentHeight / 2 - height / 2
            flickableItem.contentX = flickableItem.contentWidth / 2 - width / 2
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @VadimPeretokin 看看我的答案:) (2认同)

Jiu*_*Jiu 5

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

解决方案很简单,只需存储滚动条指针并根据需要对其进行控制。

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 0.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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

主文件

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)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)