aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/quick/pointerhandlers
diff options
context:
space:
mode:
authorYoungSun Park <cathy.park@lge.com>2019-08-16 21:32:22 +0900
committerJohannes Oikarinen <johannes.oikarinen@qt.io>2020-09-15 15:38:19 +0300
commit3ff11ceca37dcc4b6f0420332fa7f6aa007be7f3 (patch)
treef23018b359d2502527fc1a9706fb2152e2bc3197 /tests/auto/quick/pointerhandlers
parent6412bcd2219d2a5c1f8193d8f394ddb1279dee2b (diff)
QQuickWindow: Consider z-order of children when delivering pointer events
When creating a target item list for handling pointer events, put children after the parent item if they have negative z-order value. This fixes an issue where an item does not receive a pointer event if there is a child item that accepts the event even when that child item is shown under the parent item as per the stacking order. Fixes: QTBUG-83114 Pick-to: 5.15 Change-Id: I711faa22516f5c2396b1138dc507bcaa4ba22241 Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
Diffstat (limited to 'tests/auto/quick/pointerhandlers')
-rw-r--r--tests/auto/quick/pointerhandlers/qquicktaphandler/data/tapHandlersOverlapped.qml60
-rw-r--r--tests/auto/quick/pointerhandlers/qquicktaphandler/tst_qquicktaphandler.cpp33
2 files changed, 93 insertions, 0 deletions
diff --git a/tests/auto/quick/pointerhandlers/qquicktaphandler/data/tapHandlersOverlapped.qml b/tests/auto/quick/pointerhandlers/qquicktaphandler/data/tapHandlersOverlapped.qml
new file mode 100644
index 0000000000..8d2e36d921
--- /dev/null
+++ b/tests/auto/quick/pointerhandlers/qquicktaphandler/data/tapHandlersOverlapped.qml
@@ -0,0 +1,60 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 2.12
+
+Item {
+ width: 300
+ height: 200
+ property var taps: []
+
+ Rectangle {
+ x: 25
+ y: 25
+ width: 200
+ height: 100
+ color: "salmon"
+
+ TapHandler {
+ objectName: "parentTapHandler"
+ onTapped: taps.push(objectName)
+ }
+
+ Rectangle {
+ x: 25
+ y: 25
+ width: 200
+ height: 100
+ color: "lightsteelblue"
+
+ TapHandler {
+ objectName: "childTapHandler"
+ onTapped: taps.push(objectName)
+ }
+ }
+ }
+}
diff --git a/tests/auto/quick/pointerhandlers/qquicktaphandler/tst_qquicktaphandler.cpp b/tests/auto/quick/pointerhandlers/qquicktaphandler/tst_qquicktaphandler.cpp
index 32a68293c2..89de571abd 100644
--- a/tests/auto/quick/pointerhandlers/qquicktaphandler/tst_qquicktaphandler.cpp
+++ b/tests/auto/quick/pointerhandlers/qquicktaphandler/tst_qquicktaphandler.cpp
@@ -70,6 +70,7 @@ private slots:
void buttonsMultiTouch();
void componentUserBehavioralOverride();
void rightLongPressIgnoreWheel();
+ void negativeZStackingOrder();
private:
void createView(QScopedPointer<QQuickView> &window, const char *fileName);
@@ -744,6 +745,38 @@ void tst_TapHandler::rightLongPressIgnoreWheel()
QCOMPARE(tappedSpy.count(), 0);
}
+void tst_TapHandler::negativeZStackingOrder() // QTBUG-83114
+{
+ QScopedPointer<QQuickView> windowPtr;
+ createView(windowPtr, "tapHandlersOverlapped.qml");
+ QQuickView *window = windowPtr.data();
+ QQuickItem *root = window->rootObject();
+
+ QQuickTapHandler *parentTapHandler = window->rootObject()->findChild<QQuickTapHandler*>("parentTapHandler");
+ QVERIFY(parentTapHandler != nullptr);
+ QSignalSpy clickSpyParent(parentTapHandler, &QQuickTapHandler::tapped);
+ QQuickTapHandler *childTapHandler = window->rootObject()->findChild<QQuickTapHandler*>("childTapHandler");
+ QVERIFY(childTapHandler != nullptr);
+ QSignalSpy clickSpyChild(childTapHandler, &QQuickTapHandler::tapped);
+
+ QTest::mouseClick(window, Qt::LeftButton, Qt::NoModifier, QPoint(150, 100));
+ QCOMPARE(clickSpyChild.count(), 1);
+ QCOMPARE(clickSpyParent.count(), 1);
+ auto order = root->property("taps").toList();
+ QVERIFY(order.at(0) == "childTapHandler");
+ QVERIFY(order.at(1) == "parentTapHandler");
+
+ // Now change stacking order and try again.
+ childTapHandler->parentItem()->setZ(-1);
+ root->setProperty("taps", QVariantList());
+ QTest::mouseClick(window, Qt::LeftButton, Qt::NoModifier, QPoint(150, 100));
+ QCOMPARE(clickSpyChild.count(), 2);
+ QCOMPARE(clickSpyParent.count(), 2);
+ order = root->property("taps").toList();
+ QVERIFY(order.at(0) == "parentTapHandler");
+ QVERIFY(order.at(1) == "childTapHandler");
+}
+
QTEST_MAIN(tst_TapHandler)
#include "tst_qquicktaphandler.moc"