107 class tst_QTouchEventGraphicsItem : public QGraphicsItem |
107 class tst_QTouchEventGraphicsItem : public QGraphicsItem |
108 { |
108 { |
109 public: |
109 public: |
110 QList<QTouchEvent::TouchPoint> touchBeginPoints, touchUpdatePoints, touchEndPoints; |
110 QList<QTouchEvent::TouchPoint> touchBeginPoints, touchUpdatePoints, touchEndPoints; |
111 bool seenTouchBegin, seenTouchUpdate, seenTouchEnd; |
111 bool seenTouchBegin, seenTouchUpdate, seenTouchEnd; |
|
112 int touchBeginCounter, touchUpdateCounter, touchEndCounter; |
112 bool acceptTouchBegin, acceptTouchUpdate, acceptTouchEnd; |
113 bool acceptTouchBegin, acceptTouchUpdate, acceptTouchEnd; |
113 bool deleteInTouchBegin, deleteInTouchUpdate, deleteInTouchEnd; |
114 bool deleteInTouchBegin, deleteInTouchUpdate, deleteInTouchEnd; |
114 tst_QTouchEventGraphicsItem **weakpointer; |
115 tst_QTouchEventGraphicsItem **weakpointer; |
115 |
116 |
116 tst_QTouchEventGraphicsItem() |
117 tst_QTouchEventGraphicsItem() |
129 { |
130 { |
130 touchBeginPoints.clear(); |
131 touchBeginPoints.clear(); |
131 touchUpdatePoints.clear(); |
132 touchUpdatePoints.clear(); |
132 touchEndPoints.clear(); |
133 touchEndPoints.clear(); |
133 seenTouchBegin = seenTouchUpdate = seenTouchEnd = false; |
134 seenTouchBegin = seenTouchUpdate = seenTouchEnd = false; |
|
135 touchBeginCounter = touchUpdateCounter = touchEndCounter = 0; |
134 acceptTouchBegin = acceptTouchUpdate = acceptTouchEnd = true; |
136 acceptTouchBegin = acceptTouchUpdate = acceptTouchEnd = true; |
135 deleteInTouchBegin = deleteInTouchUpdate = deleteInTouchEnd = false; |
137 deleteInTouchBegin = deleteInTouchUpdate = deleteInTouchEnd = false; |
136 } |
138 } |
137 |
139 |
138 QRectF boundingRect() const { return QRectF(0, 0, 10, 10); } |
140 QRectF boundingRect() const { return QRectF(0, 0, 10, 10); } |
144 case QEvent::TouchBegin: |
146 case QEvent::TouchBegin: |
145 if (seenTouchBegin) qWarning("TouchBegin: already seen a TouchBegin"); |
147 if (seenTouchBegin) qWarning("TouchBegin: already seen a TouchBegin"); |
146 if (seenTouchUpdate) qWarning("TouchBegin: TouchUpdate cannot happen before TouchBegin"); |
148 if (seenTouchUpdate) qWarning("TouchBegin: TouchUpdate cannot happen before TouchBegin"); |
147 if (seenTouchEnd) qWarning("TouchBegin: TouchEnd cannot happen before TouchBegin"); |
149 if (seenTouchEnd) qWarning("TouchBegin: TouchEnd cannot happen before TouchBegin"); |
148 seenTouchBegin = !seenTouchBegin && !seenTouchUpdate && !seenTouchEnd; |
150 seenTouchBegin = !seenTouchBegin && !seenTouchUpdate && !seenTouchEnd; |
|
151 ++touchBeginCounter; |
149 touchBeginPoints = static_cast<QTouchEvent *>(event)->touchPoints(); |
152 touchBeginPoints = static_cast<QTouchEvent *>(event)->touchPoints(); |
150 event->setAccepted(acceptTouchBegin); |
153 event->setAccepted(acceptTouchBegin); |
151 if (deleteInTouchBegin) |
154 if (deleteInTouchBegin) |
152 delete this; |
155 delete this; |
153 break; |
156 break; |
154 case QEvent::TouchUpdate: |
157 case QEvent::TouchUpdate: |
155 if (!seenTouchBegin) qWarning("TouchUpdate: have not seen TouchBegin"); |
158 if (!seenTouchBegin) qWarning("TouchUpdate: have not seen TouchBegin"); |
156 if (seenTouchEnd) qWarning("TouchUpdate: TouchEnd cannot happen before TouchUpdate"); |
159 if (seenTouchEnd) qWarning("TouchUpdate: TouchEnd cannot happen before TouchUpdate"); |
157 seenTouchUpdate = seenTouchBegin && !seenTouchEnd; |
160 seenTouchUpdate = seenTouchBegin && !seenTouchEnd; |
|
161 ++touchUpdateCounter; |
158 touchUpdatePoints = static_cast<QTouchEvent *>(event)->touchPoints(); |
162 touchUpdatePoints = static_cast<QTouchEvent *>(event)->touchPoints(); |
159 event->setAccepted(acceptTouchUpdate); |
163 event->setAccepted(acceptTouchUpdate); |
160 if (deleteInTouchUpdate) |
164 if (deleteInTouchUpdate) |
161 delete this; |
165 delete this; |
162 break; |
166 break; |
163 case QEvent::TouchEnd: |
167 case QEvent::TouchEnd: |
164 if (!seenTouchBegin) qWarning("TouchEnd: have not seen TouchBegin"); |
168 if (!seenTouchBegin) qWarning("TouchEnd: have not seen TouchBegin"); |
165 if (seenTouchEnd) qWarning("TouchEnd: already seen a TouchEnd"); |
169 if (seenTouchEnd) qWarning("TouchEnd: already seen a TouchEnd"); |
166 seenTouchEnd = seenTouchBegin && !seenTouchEnd; |
170 seenTouchEnd = seenTouchBegin && !seenTouchEnd; |
|
171 ++touchEndCounter; |
167 touchEndPoints = static_cast<QTouchEvent *>(event)->touchPoints(); |
172 touchEndPoints = static_cast<QTouchEvent *>(event)->touchPoints(); |
168 event->setAccepted(acceptTouchEnd); |
173 event->setAccepted(acceptTouchEnd); |
169 if (deleteInTouchEnd) |
174 if (deleteInTouchEnd) |
170 delete this; |
175 delete this; |
171 break; |
176 break; |
192 void multiPointRawEventTranslationOnTouchScreen(); |
197 void multiPointRawEventTranslationOnTouchScreen(); |
193 void multiPointRawEventTranslationOnTouchPad(); |
198 void multiPointRawEventTranslationOnTouchPad(); |
194 void deleteInEventHandler(); |
199 void deleteInEventHandler(); |
195 void deleteInRawEventTranslation(); |
200 void deleteInRawEventTranslation(); |
196 void crashInQGraphicsSceneAfterNotHandlingTouchBegin(); |
201 void crashInQGraphicsSceneAfterNotHandlingTouchBegin(); |
|
202 void touchBeginWithGraphicsWidget(); |
197 }; |
203 }; |
198 |
204 |
199 void tst_QTouchEvent::touchDisabledByDefault() |
205 void tst_QTouchEvent::touchDisabledByDefault() |
200 { |
206 { |
201 // QWidget |
207 // QWidget |
1332 // Touch outside of the button |
1338 // Touch outside of the button |
1333 QTest::touchEvent(view.viewport()).press(0, view.mapFromScene(QPoint(10, 10))); |
1339 QTest::touchEvent(view.viewport()).press(0, view.mapFromScene(QPoint(10, 10))); |
1334 QTest::touchEvent(view.viewport()).release(0, view.mapFromScene(QPoint(10, 10))); |
1340 QTest::touchEvent(view.viewport()).release(0, view.mapFromScene(QPoint(10, 10))); |
1335 } |
1341 } |
1336 |
1342 |
|
1343 void tst_QTouchEvent::touchBeginWithGraphicsWidget() |
|
1344 { |
|
1345 QGraphicsScene scene; |
|
1346 QGraphicsView view(&scene); |
|
1347 tst_QTouchEventGraphicsItem *root; |
|
1348 root = new tst_QTouchEventGraphicsItem; |
|
1349 root->setAcceptTouchEvents(true); |
|
1350 scene.addItem(root); |
|
1351 |
|
1352 QGraphicsWidget *glassWidget = new QGraphicsWidget; |
|
1353 glassWidget->setMinimumSize(100, 100); |
|
1354 scene.addItem(glassWidget); |
|
1355 |
|
1356 view.resize(200, 200); |
|
1357 view.show(); |
|
1358 QTest::qWaitForWindowShown(&view); |
|
1359 view.fitInView(scene.sceneRect()); |
|
1360 |
|
1361 QTest::touchEvent() |
|
1362 .press(0, view.mapFromScene(root->mapToScene(3,3)), view.viewport()); |
|
1363 QTest::touchEvent() |
|
1364 .stationary(0) |
|
1365 .press(1, view.mapFromScene(root->mapToScene(6,6)), view.viewport()); |
|
1366 QTest::touchEvent() |
|
1367 .release(0, view.mapFromScene(root->mapToScene(3,3)), view.viewport()) |
|
1368 .release(1, view.mapFromScene(root->mapToScene(6,6)), view.viewport()); |
|
1369 |
|
1370 QCOMPARE(root->touchBeginCounter, 1); |
|
1371 QCOMPARE(root->touchUpdateCounter, 1); |
|
1372 QCOMPARE(root->touchEndCounter, 1); |
|
1373 QCOMPARE(root->touchUpdatePoints.size(), 2); |
|
1374 |
|
1375 root->reset(); |
|
1376 glassWidget->setWindowFlags(Qt::Window); // make the glassWidget a panel |
|
1377 |
|
1378 QTest::touchEvent() |
|
1379 .press(0, view.mapFromScene(root->mapToScene(3,3)), view.viewport()); |
|
1380 QTest::touchEvent() |
|
1381 .stationary(0) |
|
1382 .press(1, view.mapFromScene(root->mapToScene(6,6)), view.viewport()); |
|
1383 QTest::touchEvent() |
|
1384 .release(0, view.mapFromScene(root->mapToScene(3,3)), view.viewport()) |
|
1385 .release(1, view.mapFromScene(root->mapToScene(6,6)), view.viewport()); |
|
1386 |
|
1387 QCOMPARE(root->touchBeginCounter, 0); |
|
1388 QCOMPARE(root->touchUpdateCounter, 0); |
|
1389 QCOMPARE(root->touchEndCounter, 0); |
|
1390 |
|
1391 |
|
1392 delete root; |
|
1393 delete glassWidget; |
|
1394 } |
|
1395 |
1337 QTEST_MAIN(tst_QTouchEvent) |
1396 QTEST_MAIN(tst_QTouchEvent) |
1338 |
1397 |
1339 #include "tst_qtouchevent.moc" |
1398 #include "tst_qtouchevent.moc" |