aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndras Becsi <andras.becsi@nokia.com>2012-01-23 17:38:25 +0100
committerQt by Nokia <qt-info@nokia.com>2012-01-24 05:49:48 +0100
commit1ea7442ec3a3560697c178c5b37ac428e95560f6 (patch)
tree0c0d7721550e7aca77244efc6b99d03db73160b9
parent39f4b17c18b55bb2abe2be8e39bff8d8cf8f3b10 (diff)
QQuickCanvas::event should return true if the touch event was accepted
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>
-rw-r--r--src/quick/items/qquickcanvas.cpp5
-rw-r--r--tests/auto/qtquick2/qquickitem/tst_qquickitem.cpp40
2 files changed, 42 insertions, 3 deletions
diff --git a/src/quick/items/qquickcanvas.cpp b/src/quick/items/qquickcanvas.cpp
index 367cfbd786..fa7931a102 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<QTouchEvent *>(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 a3c64297ab..dccf055ae8 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;