【发布时间】: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 可以使用此解决方法,但它会破坏我的代码,因为如果鼠标在按下时被拒绝,我将不会收到
positionChanged和released信号。只有在 XAxis 上(在 onPositionsChanged 中)有一定距离时,我才试图拒绝它,但它在那里不起作用。此外,专注也无济于事。 -
专注是一件让人头疼的事情。我也尝试使用它。嗯...你不能使用
drag+MouseX来拦截滑动吗? -
抱歉,没完全明白你的意思。在这种情况下是否也需要
propagateComposedEvents? -
对不起,我不是故意的 :)。但是,我两天不能接受我的回答。会在那个学期之后做。