diff --git a/src/quickwidgets/qquickwidget.cpp b/src/quickwidgets/qquickwidget.cpp index 5b3e4394ce..c2c0f6f8d3 100644 --- a/src/quickwidgets/qquickwidget.cpp +++ b/src/quickwidgets/qquickwidget.cpp @@ -1665,7 +1665,7 @@ bool QQuickWidget::event(QEvent *e) QPointerEvent *pointerEvent = static_cast(e); auto deliveredPoints = pointerEvent->points(); for (auto &point : deliveredPoints) { - if (pointerEvent->exclusiveGrabber(point)) + if (pointerEvent->exclusiveGrabber(point) || !pointerEvent->passiveGrabbers(point).isEmpty()) point.setAccepted(true); } } diff --git a/tests/auto/quickwidgets/qquickwidget/data/tapHandler.qml b/tests/auto/quickwidgets/qquickwidget/data/tapHandler.qml new file mode 100644 index 0000000000..fe3d1925e5 --- /dev/null +++ b/tests/auto/quickwidgets/qquickwidget/data/tapHandler.qml @@ -0,0 +1,11 @@ +import QtQuick + +Rectangle { + width: 100 + height: 100 + color: th.pressed ? "steelblue" : "beige" + + TapHandler { + id: th + } +} diff --git a/tests/auto/quickwidgets/qquickwidget/tst_qquickwidget.cpp b/tests/auto/quickwidgets/qquickwidget/tst_qquickwidget.cpp index 0c88c71582..755f2dd64c 100644 --- a/tests/auto/quickwidgets/qquickwidget/tst_qquickwidget.cpp +++ b/tests/auto/quickwidgets/qquickwidget/tst_qquickwidget.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -128,6 +129,8 @@ private slots: void synthMouseFromTouch(); void touchTapMouseArea(); void touchTapButton(); + void touchTapHandler_data(); + void touchTapHandler(); void touchMultipleWidgets(); void tabKey(); void resizeOverlay(); @@ -682,6 +685,44 @@ void tst_qquickwidget::touchTapButton() QTRY_VERIFY(rootItem->property("wasClicked").toBool()); } +void tst_qquickwidget::touchTapHandler_data() +{ + QTest::addColumn("guiSynthMouse"); // AA_SynthesizeMouseForUnhandledTouchEvents + QTest::addColumn("gesturePolicy"); + + // QTest::newRow("nosynth: passive grab") << false << QQuickTapHandler::DragThreshold; // still failing + QTest::newRow("nosynth: exclusive grab") << false << QQuickTapHandler::ReleaseWithinBounds; + QTest::newRow("allowsynth: passive grab") << true << QQuickTapHandler::DragThreshold; // QTBUG-113558 + QTest::newRow("allowsynth: exclusive grab") << true << QQuickTapHandler::ReleaseWithinBounds; +} + +void tst_qquickwidget::touchTapHandler() +{ + QFETCH(bool, guiSynthMouse); + QFETCH(QQuickTapHandler::GesturePolicy, gesturePolicy); + + QCoreApplication::setAttribute(Qt::AA_SynthesizeMouseForUnhandledTouchEvents, guiSynthMouse); + QQuickWidget quick; + QVERIFY(quick.testAttribute(Qt::WA_AcceptTouchEvents)); + quick.setSource(testFileUrl("tapHandler.qml")); + quick.show(); + QVERIFY(QTest::qWaitForWindowExposed(&quick)); + + QQuickItem *rootItem = quick.rootObject(); + QVERIFY(rootItem); + QQuickTapHandler *th = rootItem->findChild(); + QVERIFY(th); + th->setGesturePolicy(gesturePolicy); + QSignalSpy tappedSpy(th, &QQuickTapHandler::tapped); + + const QPoint p(50, 50); + QTest::touchEvent(&quick, device).press(0, p, &quick); + QTRY_COMPARE(th->isPressed(), true); + QTest::touchEvent(&quick, device).release(0, p, &quick); + QTRY_COMPARE(tappedSpy.size(), 1); + QCOMPARE(th->isPressed(), false); +} + void tst_qquickwidget::touchMultipleWidgets() { QWidget window;