Flickable内部的鼠标区域正在阻止其轻弹



我正在用MouseArea实现手势捕捉器(向左/向右滑动)。它应该在Flickable内部使用垂直的flickableDirection。此外,它还应该按照视觉堆栈顺序将鼠标事件传播到它下面的其他元素。问题是propagateComposedEvents设置为true的子mouseArea会在单击一次之前阻止任何父级的轻击。第一次点击后,它正常工作。下面是显示这一点的简化代码。

import QtQuick 2.4
import QtQuick.Window 2.2
Window {
    id: __root
    visible: true
    width: 460; height: 640
    Flickable {
        id: mainFlickable
        width: parent.width
        height: parent.height
        contentHeight: column.height
        flickableDirection: Flickable.VerticalFlick
        MouseArea {
            anchors.fill: parent
            propagateComposedEvents: true
            z: 1
        }
        Column {
            id: column
            width: parent.width
            Repeater {
                model: 5
                Rectangle {
                    width: __root.width
                    height: 200
                    color: "yellow"
                    border.width: 2
                    MouseArea {
                        anchors.fill: parent
                        onClicked: {
                            console.log("clicked")
                        }
                    }
                }
            } //repeater
        } //column
    } //flickable
} //window

我花了相当长的时间试图解决这个问题,并将感谢任何帮助。提前感谢!

我发现MouseArea中的以下信号处理程序是解决这个问题的方法,并且不会破坏我的代码:

onReleased: {
    if (!propagateComposedEvents) {
        propagateComposedEvents = true
    }
}

声明中的propagateComposedEvents应设置为false(或已提交)。

感谢大家的努力!

我几乎找不到解决方法。希望它能满足您的需求(至少在提供更好的解决方案之前)。

这是您的更新代码:

import QtQuick 2.4
import QtQuick.Window 2.2
Window {
    id: __root
    visible: true
    width: 460; height: 640
    Flickable {
        id: mainFlickable
        width: parent.width
        height: parent.height
        contentHeight: column.height
        flickableDirection: Flickable.VerticalFlick
        onDragStarted: ma.enabled = false
        onDragEnded: ma.enabled = true
        MouseArea {
            id: ma
            anchors.fill: parent
            enabled: false
            propagateComposedEvents: true
            z: 100
            onClicked: {
                print("CLICKED ON UPPER")
                mouse.accepted = false
            }
        }
        Column {
            id: column
            width: parent.width
            Repeater {
                model: 5
                Rectangle {
                    width: __root.width
                    height: 200
                    color: "yellow"
                    border.width: 2
                    MouseArea {
                        anchors.fill: parent                  
                        onClicked: console.log("clicked on child") 
                    }
                }
            } //repeater
        } //column
    } //flickable
} //window

相关内容

  • 没有找到相关文章

最新更新