From f681e0e2dbf8605004528e71d8deb5a5b0e8cfa7 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 4 Apr 2019 17:59:17 +0200 Subject: [PATCH] workround for Qt < 5.10 added --- src/controls/QskControl.cpp | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/controls/QskControl.cpp b/src/controls/QskControl.cpp index 3b391a14..949e9e71 100644 --- a/src/controls/QskControl.cpp +++ b/src/controls/QskControl.cpp @@ -1545,7 +1545,7 @@ bool QskControl::childMouseEventFilter( QQuickItem* item, QEvent* event ) if ( event->type() == QEvent::MouseButtonPress ) { - auto me = static_cast< const QMouseEvent* >( event ); + auto me = static_cast< QMouseEvent* >( event ); if ( me->source() == Qt::MouseEventSynthesizedByQt ) { @@ -1554,15 +1554,37 @@ bool QskControl::childMouseEventFilter( QQuickItem* item, QEvent* event ) mouse events. For all versions < 5.10 those events are passed through childMouseEventFilter without doing the extra checks, that are done for real mouse events. + Furthermore the coordinates are relative + to this - not to item. + To avoid having a different behavior between using mouse and touch, we do those checks here. */ - if ( !( item->acceptedMouseButtons() & me->button() ) ) - return false; - const auto pos = item->mapFromScene( me->windowPos() ); - if ( !item->contains( pos ) ) - return false; + auto itm = item; + auto pos = item->mapFromScene( me->windowPos() ); + + for ( itm = item; itm != this; itm = itm->parentItem() ) + { + if ( itm->acceptedMouseButtons() & me->button() ) + { + if ( itm->contains( pos ) ) + break; + } + + pos += QPointF( itm->x(), itm->y() ); + } + + if ( itm != item ) + { + if ( itm == this ) + return false; + + QScopedPointer clonedEvent( + QQuickWindowPrivate::cloneMouseEvent( me, &pos ) ); + + return d_func()->maybeGesture( itm, clonedEvent.data() ); + } } }