1

我想在 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 {
    target: scrollView.flickableItem
    onMovementEnded: {
        console.log("onMovementEnded")
    }
}
4

2 回答 2

2

从文档中:

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

...

flickableItem : 项目

ScrollView 的 flickableItem。如果提供给 ScrollView 的 contentItem 是 Fl​​ickable,它将是 contentItem。

在我看来,flickableItem只有当滚动视图与Flickable. 而在你的代码中它不是。

编辑:经过一番调查后,我发现即使您不使用该属性, a 也存在Flickable,但是只有在您有实际内部时才会发出信号,并且只有当您从所有快速滚动时才会发出信号使用鼠标滚轮从上到下或后退的方式,轻弹不会这样做,使用滚动条不会这样做。不理想,有点马车...FlickableScrollView

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

于 2016-09-19T10:15:43.540 回答
0

根据@ddriver 的输入,我使用onContentYChanged和计时器构建了一个解决方案。这对我来说已经足够了,即使它并不完美。

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")
        }
    }

}
于 2016-09-20T11:09:23.900 回答