[Qt-qml] Mouse Event Filtering in QML 2

Alan Alpert alan.alpert at nokia.com
Fri Jun 10 03:35:06 CEST 2011


On Fri, 10 Jun 2011 10:28:03 ext aaron.kennedy at nokia.com wrote:
> Hi,
> 
> On 10/06/2011, at 10:02 AM, ext michael.brasser at nokia.com wrote:
> > On 07/06/2011, at 10:51 AM, ext Alan Alpert wrote:
> >> On Tue, 7 Jun 2011 01:23:51 Cunha Leo (Nokia-MP-Qt/Oslo) wrote:
> >>> hi,
> >>> 
> >>> in qml1 I used to have an empty MouseArea{ enabled: animation.running }
> >>> to filter events while an animation was ongoing.
> >>> 
> >>> in qml2 this empty mouse area is no longer accepting the events by
> >>> default, so the only way I found was to declare empty handlers for all
> >>> mouse events.
> >>> 
> >>> is there a better way to achieve mouse events filtering in qml2 ?
> >>> 
> >>> cheers,
> >>> // leo
> >> 
> >> Currently you do need to declare empty handlers, due to changes in mouse
> >> event propagation, but this is clearly not ideal. I don't think the
> >> empty mouse area was that great either though. Do you have any
> >> suggestions on the best way to accomplish this?
> > 
> > What about a convenience MouseBlocker element? e.g. something like:
> > 
> > //MouseBlocker.qml
> > import QtQuick 2.0
> > MouseArea {
> > 
> >    onPressed: {}
> >    onClicked: {}
> >    onPressAndHold: {}
> >    onDoubleClicked: {}
> > 
> > }
> 
> Has anyone investigated exactly why this has changed?  As far as I know it
> wasn't intentional, so we should probably figure it out and decide which
> behavior we want before we go developing work arounds :)

It was intentional, it's the fix for QTBUG-13007. 

Most of the discussion is in the comments of that issue, but the basic 
reasoning is that the higher level input abstractions need to be propagated 
differently. Qt's standard event processing passes along low-level input 
events like press and release just fine, but does not handle redirecting 
clicks or other events made after the initial press. The simplest and most 
intuitive way to propagate these events in QML is to have them be handled by 
the first item that asks to handle them, in stacking order. This does mean 
that they propagate individually, and simply grabbing the pressed event will 
no longer stop all mouse events. Hence the current issue.

I think the MouseBlocker element is a good solution, because it's clearer than 
the empty MouseArea that we had before and just as easy to use.

-- 
Alan Alpert
Senior Engineer
Nokia, Qt Development Frameworks


More information about the Qt-qml mailing list