diff options
-rw-r--r-- | src/quick/items/qquickwindow.cpp | 5 | ||||
-rw-r--r-- | tests/auto/quick/qquickwindow/tst_qquickwindow.cpp | 108 |
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" |