我正在用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