aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quick/items/qquickwindow.cpp5
-rw-r--r--tests/auto/quick/qquickwindow/tst_qquickwindow.cpp108
2 files changed, 113 insertions, 0 deletions
diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp
index 2c8b24baf6..f58bd489fe 100644
--- a/src/quick/items/qquickwindow.cpp
+++ b/src/quick/items/qquickwindow.cpp
@@ -1596,6 +1596,11 @@ bool QQuickWindowPrivate::sendHoverEvent(QEvent::Type type, QQuickItem *item,
QHoverEvent hoverEvent(type, transform.map(scenePos), transform.map(lastScenePos), modifiers);
hoverEvent.setAccepted(accepted);
+ QSet<QQuickItem *> hasFiltered;
+ if (sendFilteredMouseEvent(item->parentItem(), item, &hoverEvent, &hasFiltered)) {
+ return true;
+ }
+
q->sendEvent(item, &hoverEvent);
return hoverEvent.isAccepted();
diff --git a/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp b/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp
index e019c57ccb..f4f948c429 100644
--- a/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp
+++ b/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp
@@ -365,6 +365,7 @@ private slots:
void testRenderJob();
+ void testHoverChildMouseEventFilter();
private:
QTouchDevice *touchDevice;
QTouchDevice *touchDeviceWithVelocity;
@@ -2046,6 +2047,113 @@ void tst_qquickwindow::testRenderJob()
QCOMPARE(RenderJob::deleted, 5);
}
+class EventCounter : public QQuickRectangle
+{
+ Q_OBJECT
+public:
+ EventCounter(QQuickItem *parent = 0)
+ : QQuickRectangle(parent)
+ { }
+
+ void addFilterEvent(QEvent::Type type)
+ {
+ m_returnTrueForType.append(type);
+ }
+
+ int childMouseEventFilterEventCount(QEvent::Type type)
+ {
+ return m_childMouseEventFilterEventCount.value(type, 0);
+ }
+
+ int eventCount(QEvent::Type type)
+ {
+ return m_eventCount.value(type, 0);
+ }
+
+ void reset()
+ {
+ m_eventCount.clear();
+ m_childMouseEventFilterEventCount.clear();
+ }
+protected:
+ bool childMouseEventFilter(QQuickItem *, QEvent *event) Q_DECL_OVERRIDE
+ {
+ m_childMouseEventFilterEventCount[event->type()]++;
+ return m_returnTrueForType.contains(event->type());
+ }
+
+ bool event(QEvent *event) Q_DECL_OVERRIDE
+ {
+ m_eventCount[event->type()]++;
+ return QQuickRectangle::event(event);
+ }
+
+
+private:
+ QList<QEvent::Type> m_returnTrueForType;
+ QMap<QEvent::Type, int> m_childMouseEventFilterEventCount;
+ QMap<QEvent::Type, int> m_eventCount;
+};
+
+void tst_qquickwindow::testHoverChildMouseEventFilter()
+{
+ QQuickWindow window;
+
+ window.resize(250, 250);
+ window.setPosition(100, 100);
+ window.show();
+ QVERIFY(QTest::qWaitForWindowExposed(&window));
+
+ EventCounter *bottomItem = new EventCounter(window.contentItem());
+ bottomItem->setObjectName("Bottom Item");
+ bottomItem->setSize(QSizeF(150, 150));
+ bottomItem->setAcceptHoverEvents(true);
+
+ EventCounter *middleItem = new EventCounter(bottomItem);
+ middleItem->setObjectName("Middle Item");
+ middleItem->setPosition(QPointF(50, 50));
+ middleItem->setSize(QSizeF(150, 150));
+ middleItem->setAcceptHoverEvents(true);
+
+ EventCounter *topItem = new EventCounter(middleItem);
+ topItem->setObjectName("Top Item");
+ topItem->setPosition(QPointF(50, 50));
+ topItem->setSize(QSizeF(150, 150));
+ topItem->setAcceptHoverEvents(true);
+
+ QPoint pos(10, 10);
+
+ QTest::mouseMove(&window, pos);
+
+ QTRY_VERIFY(bottomItem->eventCount(QEvent::HoverEnter) > 0);
+ QVERIFY(bottomItem->childMouseEventFilterEventCount(QEvent::HoverEnter) == 0);
+ QVERIFY(middleItem->eventCount(QEvent::HoverEnter) == 0);
+ QVERIFY(topItem->eventCount(QEvent::HoverEnter) == 0);
+ bottomItem->reset();
+
+ pos = QPoint(60, 60);
+ QTest::mouseMove(&window, pos);
+ QTRY_VERIFY(middleItem->eventCount(QEvent::HoverEnter) > 0);
+ QVERIFY(bottomItem->childMouseEventFilterEventCount(QEvent::HoverEnter) == 0);
+ middleItem->reset();
+
+ pos = QPoint(70,70);
+ bottomItem->setFiltersChildMouseEvents(true);
+ QTest::mouseMove(&window, pos);
+ QTRY_VERIFY(middleItem->eventCount(QEvent::HoverMove) > 0);
+ QVERIFY(bottomItem->childMouseEventFilterEventCount(QEvent::HoverMove) > 0);
+ QVERIFY(topItem->eventCount(QEvent::HoverEnter) == 0);
+ bottomItem->reset();
+ middleItem->reset();
+
+ pos = QPoint(110,110);
+ bottomItem->addFilterEvent(QEvent::HoverEnter);
+ QTest::mouseMove(&window, pos);
+ QTRY_VERIFY(bottomItem->childMouseEventFilterEventCount(QEvent::HoverEnter) > 0);
+ QVERIFY(topItem->eventCount(QEvent::HoverEnter) == 0);
+ QVERIFY(middleItem->eventCount(QEvent::HoverEnter) == 0);
+}
+
QTEST_MAIN(tst_qquickwindow)
#include "tst_qquickwindow.moc"