aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJørgen Lind <jorgen.lind@theqtcompany.com>2015-01-14 09:41:23 +0100
committerJørgen Lind <jorgen.lind@theqtcompany.com>2015-01-20 13:49:28 +0100
commit606ce564d82dd099fb1fca939692839cf571b1ac (patch)
tree45eb2b5ee6f7bb44617268156af2325d21a281ca
parent8a23c8a613b5eb360a48ee6c64ea3507caf878e2 (diff)
Send hover events also to QQuickItem::childMouseEventFilter
childMouseEventFilter already gets touch events, and it is logical to send the hover events which are essentially mouse events. By also sending hover events to the filter it allows an item to track the mouse. Existing implementations of childMouseEventFilter should not be effected by more events being sent to it as checking for the event type should be practiced in all overloads. Change-Id: Ie00aceef05e41e4e8f6d80007343c5a5b9f566cf Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
-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"