Here is my QML code :
Rectangle
{
.....
Rectangle
{
....height and width is smaller than parent
MouseArea
{
id: mouseArea2
anchors.fill: parent
hoverEnabled: true
onEntered:
{
console.log("enter 2")
}
}
}
MouseArea
{
id: mouseArea1
anchors.fill: parent
hoverEnabled: true
onEntered:
{
console.log("enter 1")
}
}
}
Only mouseArea1
takes effect. If I remove mouseArea1
then mouseArea2
takes effect. So I think the mouse event must be handled by mouseArea1
and let it couldn't be passed to mouseArea2
.
I search the document to find out which attr can prevent such behavior but nothing found. So how to let the mouseArea1
and mouseArea2
take effect at the same time?
I have found the solution in the documentation. Take for instance the following QML code:
Here the yellow
Rectangle
contains a blue Rectangle. The latter is the top-most item in the hierarchy of the visual stacking order; it will visually rendered above the former.Since the blue
Rectangle
setspropagateComposedEvents
totrue
, and also setsMouseEvent::accepted
tofalse
for all received clicked events, any clicked events it receives are propagated to theMouseArea
of the yellow rectangle beneath it.Clicking on the blue
Rectangle
will cause theonClicked
handler of its childMouseArea
to be invoked; the event will then be propagated to theMouseArea
of the yellowRectangle
, causing its ownonClicked
handler to be invoked.For "composed" mouse events --
clicked
,doubleClicked
andpressAndHold
-- you can achieve this using thepropagateComposedEvents
property. But that won't work here because hover events are not composed events.So what you need to do instead is to change the order in which the
MouseArea
s are evaluated.One simple trick is to swap the order of the two
MouseArea
s in the QML source itself. By placing the smaller one after the larger one, the smaller one takes precedence:A second method that achieves the same thing is to add a
z
index to the topmostMouseArea
that's greater than the lower one. By default every element has az
index of0
, so just addingz: 1
to the smallerMouseArea
will do the trick: