examples/multitouch/pinchzoom/graphicsview.cpp
changeset 3 41300fa6a67c
parent 0 1918ee327afb
child 4 3b1da2848fc7
equal deleted inserted replaced
2:56cd8111b7f7 3:41300fa6a67c
    43 
    43 
    44 #include <QScrollBar>
    44 #include <QScrollBar>
    45 #include <QTouchEvent>
    45 #include <QTouchEvent>
    46 
    46 
    47 GraphicsView::GraphicsView(QGraphicsScene *scene, QWidget *parent)
    47 GraphicsView::GraphicsView(QGraphicsScene *scene, QWidget *parent)
    48     : QGraphicsView(scene, parent)
    48     : QGraphicsView(scene, parent), totalScaleFactor(1)
    49 {
    49 {
    50     viewport()->setAttribute(Qt::WA_AcceptTouchEvents);
    50     viewport()->setAttribute(Qt::WA_AcceptTouchEvents);
    51     setDragMode(ScrollHandDrag);
    51     setDragMode(ScrollHandDrag);
    52 }
    52 }
    53 
    53 
    56     switch (event->type()) {
    56     switch (event->type()) {
    57     case QEvent::TouchBegin:
    57     case QEvent::TouchBegin:
    58     case QEvent::TouchUpdate:
    58     case QEvent::TouchUpdate:
    59     case QEvent::TouchEnd:
    59     case QEvent::TouchEnd:
    60     {
    60     {
    61         QList<QTouchEvent::TouchPoint> touchPoints = static_cast<QTouchEvent *>(event)->touchPoints();
    61         QTouchEvent *touchEvent = static_cast<QTouchEvent *>(event);
       
    62         QList<QTouchEvent::TouchPoint> touchPoints = touchEvent->touchPoints();
    62         if (touchPoints.count() == 2) {
    63         if (touchPoints.count() == 2) {
    63             // determine scale factor
    64             // determine scale factor
    64             const QTouchEvent::TouchPoint &touchPoint0 = touchPoints.first();
    65             const QTouchEvent::TouchPoint &touchPoint0 = touchPoints.first();
    65             const QTouchEvent::TouchPoint &touchPoint1 = touchPoints.last();
    66             const QTouchEvent::TouchPoint &touchPoint1 = touchPoints.last();
    66             const qreal scaleFactor = QLineF(touchPoint0.pos(), touchPoint1.pos()).length()
    67             qreal currentScaleFactor =
    67                                       / QLineF(touchPoint0.startPos(), touchPoint1.startPos()).length();
    68                     QLineF(touchPoint0.pos(), touchPoint1.pos()).length()
    68             setTransform(QTransform().scale(scaleFactor, scaleFactor));
    69                     / QLineF(touchPoint0.startPos(), touchPoint1.startPos()).length();
       
    70             if (touchEvent->touchPointStates() & Qt::TouchPointReleased) {
       
    71                 // if one of the fingers is released, remember the current scale
       
    72                 // factor so that adding another finger later will continue zooming
       
    73                 // by adding new scale factor to the existing remembered value.
       
    74                 totalScaleFactor *= currentScaleFactor;
       
    75                 currentScaleFactor = 1;
       
    76             }
       
    77             setTransform(QTransform().scale(totalScaleFactor * currentScaleFactor,
       
    78                                             totalScaleFactor * currentScaleFactor));
    69         }
    79         }
    70         return true;
    80         return true;
    71     }
    81     }
    72     default:
    82     default:
    73         break;
    83         break;