tests/auto/qtouchevent/tst_qtouchevent.cpp
changeset 37 758a864f9613
parent 18 2f34d5167611
equal deleted inserted replaced
36:ef0373b55136 37:758a864f9613
   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"