【问题标题】:MouseArea inside Flickable is preventing it from flickingFlickable 内的 MouseArea 阻止它轻弹
【发布时间】:2015-03-24 15:33:44
【问题描述】:

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

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

我花了很长时间试图解决这个问题,如果有任何帮助,我将不胜感激。提前致谢!

【问题讨论】:

  • 工作代码+1:这样可以节省时间!至于这个问题,它对我来说就像一个错误。 Pressed 事件自动被接受,这就是第一次发生的事情,即外部 MouseArea 吞噬了事件。之后,Flickable 获得控制权。 Flickable 似乎需要“热身”。不确定对焦是否有帮助。可能的解决方法(希望它不会破坏您的用例)是将onPressed: mouse.accepted = false 添加到外部MouseArea 以始终传播pressed 事件。
  • 感谢您的回答!尽管 Flickable 可以使用此解决方法,但它会破坏我的代码,因为如果鼠标在按下时被拒绝,我将不会收到 positionChangedreleased 信号。只有在 XAxis 上(在 onPositionsChanged 中)有一定距离时,我才试图拒绝它,但它在那里不起作用。此外,专注也无济于事。
  • 专注是一件让人头疼的事情。我也尝试使用它。嗯...你不能使用drag + MouseX 来拦截滑动吗?
  • 抱歉,没完全明白你的意思。在这种情况下是否也需要propagateComposedEvents
  • 对不起,我不是故意的 :)。但是,我两天不能接受我的回答。会在那个学期之后做。

标签: qt qml qt5 qt-quick


【解决方案1】:

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

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

propagateComposedEvents 应在声明中设置为false(或省略)。

感谢大家的努力!

【讨论】:

    【解决方案2】:

    我发现了很少的解决方法。希望它能够满足您的需求(至少在提供更好的解决方案之前)。

    这是您的更新代码:

    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
    

    【讨论】:

    • mouse.accepted = false 是一种解决方法,但会破坏我的逻辑,因为它会阻止未来的positionChangedreleased 信号。非常感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    相关资源
    最近更新 更多