From 1ea7442ec3a3560697c178c5b37ac428e95560f6 Mon Sep 17 00:00:00 2001 From: Andras Becsi Date: Mon, 23 Jan 2012 17:38:25 +0100 Subject: [PATCH] QQuickCanvas::event should return true if the touch event was accepted MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit If QQuickCanvas::event delivers a touch event and it is accepted the control ends up in QWindow::event which invalidates the event. These touch events end up as if they were unhadled which causes Qt to automatically synthesize mouse events even for accepted touch events. Add a unit test for testing this behavior. Change-Id: I83d4aeafee1ea7ec5d219e4b45aae699188717c3 Reviewed-by: Zeno Albisser Reviewed-by: Samuel Rødal --- src/quick/items/qquickcanvas.cpp | 5 ++- tests/auto/qtquick2/qquickitem/tst_qquickitem.cpp | 40 +++++++++++++++++++++++ 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/quick/items/qquickcanvas.cpp b/src/quick/items/qquickcanvas.cpp index 367cfbd..fa7931a 100644 --- a/src/quick/items/qquickcanvas.cpp +++ b/src/quick/items/qquickcanvas.cpp @@ -718,9 +718,8 @@ bool QQuickCanvas::event(QEvent *e) QTouchEvent *touch = static_cast(e); d->translateTouchEvent(touch); d->deliverTouchEvent(touch); - if (!touch->isAccepted()) - return false; - break; + + return touch->isAccepted(); } case QEvent::Leave: d->clearHover(); diff --git a/tests/auto/qtquick2/qquickitem/tst_qquickitem.cpp b/tests/auto/qtquick2/qquickitem/tst_qquickitem.cpp index a3c6429..dccf055 100644 --- a/tests/auto/qtquick2/qquickitem/tst_qquickitem.cpp +++ b/tests/auto/qtquick2/qquickitem/tst_qquickitem.cpp @@ -66,9 +66,23 @@ protected: virtual void focusOutEvent(QFocusEvent *) { Q_ASSERT(focused); focused = false; } virtual void mousePressEvent(QMouseEvent *event) { event->accept(); ++pressCount; } virtual void mouseReleaseEvent(QMouseEvent *event) { event->accept(); ++releaseCount; } + virtual void touchEvent(QTouchEvent *event) { event->accept(); } virtual void wheelEvent(QWheelEvent *event) { event->accept(); ++wheelCount; } }; +class TestCanvas: public QQuickCanvas +{ +public: + TestCanvas() + : QQuickCanvas() + {} + + virtual bool event(QEvent *event) + { + return QQuickCanvas::event(event); + } +}; + class TestPolishItem : public QQuickItem { Q_OBJECT @@ -124,6 +138,7 @@ private slots: void enabled(); void mouseGrab(); + void touchEventAccept(); void polishOutsideAnimation(); void polishOnCompleted(); @@ -862,6 +877,31 @@ void tst_qquickitem::mouseGrab() delete canvas; } +void tst_qquickitem::touchEventAccept() +{ + TestCanvas *canvas = new TestCanvas; + canvas->resize(100, 100); + canvas->show(); + + TestItem *item = new TestItem; + item->setSize(QSizeF(100, 100)); + item->setParentItem(canvas->rootItem()); + + static QTouchDevice* device = new QTouchDevice; + device->setType(QTouchDevice::TouchScreen); + QWindowSystemInterface::registerTouchDevice(device); + + QTouchEvent *event = new QTouchEvent(QEvent::TouchBegin, device); + + bool accepted = canvas->event(event); + + QVERIFY(accepted && event->isAccepted()); + + delete event; + delete item; + delete canvas; +} + void tst_qquickitem::polishOutsideAnimation() { QQuickCanvas *canvas = new QQuickCanvas; -- 2.7.4