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; |