如何访问QML ScrollView的移动已结束?

时间:2016-09-19 10:04:59

标签: qt qml scrollview qtquickcontrols flickable

我想在QML ScrollView的滚动结束时做一些事情。从文档中我假设flickableItem.onMovementEnded是我正在寻找但我永远不会得到那个信号。我理解"运动"错误? 我写了这个最小的QML应用程序,我的console.log从未调用过。我在Qt 5.7或5.5.1的Mac上运行它。

import QtQuick 2.5
import QtQuick.Controls 1.4

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    ScrollView {
        id: scrollView

        anchors.fill: parent

        flickableItem.onMovementEnded: {
            console.log("onMovementEnded")
        }

        Rectangle {
            id: rect

            width: 3000
            height: 3000
        }
    }

}

我还试图通过" Connections"没有运气。

Connections {
    target: scrollView.flickableItem
    onMovementEnded: {
        console.log("onMovementEnded")
    }
}

2 个答案:

答案 0 :(得分:2)

来自文档:

  

ScrollView可用于替换Flickable或装饰   现有的Flickable。

     

...

     

flickableItem:项目

     

ScrollView的flickableItem。如果提供了contentItem   ScrollView是一个Flickable,它将是contentItem。

听起来我只有在滚动视图与flickableItem一起使用时才会填充Flickable属性。在你的代码中它不是。

编辑:稍微调查一下后,我发现即使你没有使用Flickable,该物业就在那里,但如果你有{strong>那么信号只会 Flickable内的实际ScrollView,当您从上到下快速滚动或使用鼠标滚轮向后滚动时,它将,轻弹赢了&#39这样做,使用滚动条不会做到这一点。不理想,有点儿车......

似乎你真正想要的只是使用Flickable并在其上放置手动滚动条,有很多例子如何做到这一点。然后它会在停止时发出。

答案 1 :(得分:0)

基于@ddriver的输入,我使用 onContentYChanged 和一个Timer构建了一个解决方案。这对我来说已经足够了,尽管它并不完美。

import QtQuick 2.5
import QtQuick.Controls 1.4

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    ScrollView {
        id: scrollView

        anchors.fill: parent

        flickableItem.onContentXChanged: {
            updateContentDelay.restart()
        }

        flickableItem.onContentYChanged: {
            updateContentDelay.restart()
        }

        Rectangle {
            id: rect

            width: 3000
            height: 3000
        }
    }

    Timer {
        id: updateContentDelay
        interval: 200
        repeat: false

        onTriggered: {
            console.log("do something")
        }
    }

}