diff options
2 files changed, 54 insertions, 15 deletions
diff --git a/examples/widgets/gestures/imagegestures/doc/src/imagegestures.qdoc b/examples/widgets/gestures/imagegestures/doc/src/imagegestures.qdoc
index 1b0406037c..07acef6b4d 100644
--- a/examples/widgets/gestures/imagegestures/doc/src/imagegestures.qdoc
+++ b/examples/widgets/gestures/imagegestures/doc/src/imagegestures.qdoc
@@ -83,18 +83,50 @@
QGesture subclass.
To illustrate how a standard gesture can be interpreted by an application, we
- show the implementation of the \c swipeTriggered() function, which handles the
- gesture associated with a brushing or swiping motion on the user's display or
+ show the implementation of the \c pinchTriggered() function, which handles the
+ pinch gesture when the user moves two fingers around on the display or
input device:
- \snippet gestures/imagegestures/imagewidget.cpp swipe function
- The QSwipeGesture class provides specialized functions and defines a enum
- to make it more convenient for developers to discover which direction, if
- any, the user swiped the display. Here, we simply navigate to the previous
- image in the collection if the user swiped upwards or to the left; otherwise
- we navigate to the next image in the collection.
- The other gestures are also handled by special purpose functions, but use
- the values of properties held by the QGesture object passed to them.
+ \snippet gestures/imagegestures/imagewidget.cpp pinch function
+ The QPinchGesture class provides properties to interpret the changing
+ distance between the two touch points as a zoom factor, and the angle delta
+ as a rotation to be applied to the image. The center point between the
+ touch points could be used to drag the image, but in this example we use
+ the pan gesture for that purpose.
+ The \c scaleFactor() is a relative value representing how much the zoom
+ should change from one event to the next, whereas \c totalScaleFactor()
+ provides the amount of zoom that has been expressed since the gesture
+ began. When the touch points are released and another gesture begins,
+ \c totalScaleFactor() will begin again at 1.0. In this case we store
+ \c totalScaleFactor() into the \c currentStepScaleFactor variable so that
+ it can be used in \c paintEvent() to scale the image. Alternatively it would
+ be possible to simply multiply the stored total scale factor by
+ \c scaleFactor() here in the pinch handler.
+ In contrast, \c rotationAngle() represents the amount of rotation since the
+ pinch gesture began, while \c lastRotationAngle() provides the previous
+ value. So it is necessary to subtract in order to get an incremental delta.
+ When the user begins a new pinch gesture, \c rotationAngle() will start
+ from zero, and we want the image to begin to rotate from its current angle.
+ This is achieved by adding the delta to the stored \c rotationAngle (which
+ will be applied in \c paintEvent()). If we simply assigned
+ \c totalRotationAngle() to the stored \c rotationAngle, a new gesture would
+ cause the image to reset to a right-side-up orientation before beginning to
+ rotate again. But it would be possible to store the rotation angle since the
+ gesture began and add it to \c rotationAngle in \c paintEvent(), just as
+ we store the amount of zoom since the gesture began.
+ The pan and swipe gestures in this example are also handled in separate
+ functions, and use the values of properties from the QGesture objects
+ passed to them.
+ \snippet gestures/imagegestures/imagewidget.cpp paint method
+ In \c paintEvent(), scaleFactor represents the zoom level before the pinch
+ gesture began, while currentStepScaleFactor represents the additional zoom
+ factor while a pinch gesture is in progress. But for rotation, only the
+ current rotationAngle is stored. The horizontal and vertical offsets
+ represent the distance that the image has been dragged by the pan gesture.
diff --git a/examples/widgets/gestures/imagegestures/imagewidget.cpp b/examples/widgets/gestures/imagegestures/imagewidget.cpp
index 38319a9dbe..3d0d7e7a93 100644
--- a/examples/widgets/gestures/imagegestures/imagewidget.cpp
+++ b/examples/widgets/gestures/imagegestures/imagewidget.cpp
@@ -77,6 +77,7 @@ bool ImageWidget::event(QEvent *event)
//! [event handler]
+//! [paint method]
void ImageWidget::paintEvent(QPaintEvent*)
QPainter p(this);
@@ -93,6 +94,7 @@ void ImageWidget::paintEvent(QPaintEvent*)
p.translate(-iw/2, -ih/2);
p.drawImage(0, 0, currentImage);
+//! [paint method]
void ImageWidget::mouseDoubleClickEvent(QMouseEvent *)
@@ -138,16 +140,20 @@ void ImageWidget::panTriggered(QPanGesture *gesture)
+//! [pinch function]
void ImageWidget::pinchTriggered(QPinchGesture *gesture)
QPinchGesture::ChangeFlags changeFlags = gesture->changeFlags();
if (changeFlags & QPinchGesture::RotationAngleChanged) {
- rotationAngle += gesture->rotationAngle() - gesture->lastRotationAngle();
- qCDebug(lcExample) << "pinchTriggered(): rotate to" << rotationAngle;
+ qreal rotationDelta = gesture->rotationAngle() - gesture->lastRotationAngle();
+ rotationAngle += rotationDelta;
+ qCDebug(lcExample) << "pinchTriggered(): rotate by" <<
+ rotationDelta << "->" << rotationAngle;
if (changeFlags & QPinchGesture::ScaleFactorChanged) {
currentStepScaleFactor = gesture->totalScaleFactor();
- qCDebug(lcExample) << "pinchTriggered(): zoom by" << gesture->scaleFactor() << "->" << currentStepScaleFactor;
+ qCDebug(lcExample) << "pinchTriggered(): zoom by" <<
+ gesture->scaleFactor() << "->" << currentStepScaleFactor;
if (gesture->state() == Qt::GestureFinished) {
scaleFactor *= currentStepScaleFactor;
@@ -155,6 +161,7 @@ void ImageWidget::pinchTriggered(QPinchGesture *gesture)
+//! [pinch function]
//! [swipe function]
void ImageWidget::swipeTriggered(QSwipeGesture *gesture)