QQuickCanvas::event should return true if the touch event was accepted
authorAndras Becsi <andras.becsi@nokia.com>
Mon, 23 Jan 2012 16:38:25 +0000 (17:38 +0100)
committerQt by Nokia <qt-info@nokia.com>
Tue, 24 Jan 2012 04:49:48 +0000 (05:49 +0100)
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 <zeno.albisser@nokia.com>
Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>

src/quick/items/qquickcanvas.cpp
tests/auto/qtquick2/qquickitem/tst_qquickitem.cpp

index 367cfbd..fa7931a 100644 (file)
@@ -718,9 +718,8 @@ bool QQuickCanvas::event(QEvent *e)
         QTouchEvent *touch = static_cast<QTouchEvent *>(e);
         d->translateTouchEvent(touch);
         d->deliverTouchEvent(touch);
-        if (!touch->isAccepted())
-            return false;
-        break;
+
+        return touch->isAccepted();
     }
     case QEvent::Leave:
         d->clearHover();
index a3c6429..dccf055 100644 (file)
@@ -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;