Qt QWidget实现手势缩放和平移(二)

上一篇文章中讲到了QWidget实现手势缩放和平移,通过QGestureEvent来捕捉手势操作,但是这种方式不一定能通用,比如像教学用的电子白板上,是红外触控感应,并不能通过QGestureEvent来识别手势事件,那么,只能通过第二种比较通用的方式来解决该问题了。

通用的方式就是通过touchEvent事件来捕捉触控事件,然后通过识别两个触控点的移动位置来计算要缩放的比例,这里需要实现的是两个手指放大和和缩小,然后单指移动图片的功能,该方式只要在支持多点触控的设备上就能实现手势缩放。那么,这里只需要在上一篇文章的代码基础上修改event事件实现就好了,在event事件中捕捉touchEvent事件,其余代码不变。


关键代码如下:

bool CProjectionPicture::event(QEvent *event)
{
//    if (event->type() == QEvent::Gesture)
//        return gestureEvent(static_cast(event));

    switch (event->type()) {
    case QEvent::TouchBegin:
    case QEvent::TouchUpdate:
    case QEvent::TouchEnd:
    {
        qDebug() <<"CProjectionPicture::event";
        QTouchEvent *touchEvent = static_cast(event);
        QList touchPoints = touchEvent->touchPoints();
        if (touchPoints.count() == 2) {
            m_bIsTwoPoint = true;//两指时不让移动
            const QTouchEvent::TouchPoint &touchPoint0 = touchPoints.first();
            const QTouchEvent::TouchPoint &touchPoint1 = touchPoints.last();
            qreal currentScaleFactor =
                    QLineF(touchPoint0.pos(), touchPoint1.pos()).length()
                    / QLineF(touchPoint0.startPos(), touchPoint1.startPos()).length();
            if (touchEvent->touchPointStates() & Qt::TouchPointReleased) {
                scaleFactor *= currentScaleFactor;
            }
            currentStepScaleFactor = currentScaleFactor;
            update();
        }
        else if(touchPoints.count() == 1){
            m_bIsTwoPoint = false;
        }
        return true;
    }
    default:
        break;
    }

    return QWidget::event(event);
}

这里还包含了m_bIsTwoPoint变量,该变量是用来控制区分当前是单点触控还是两点触控,用于辨别在单点时移动,两点时放大。在mouseMoveEvent中区分,代码比较简单,就不贴出来了 。

另外,由于需要捕捉touch事件,需要设置属性

setAttribute(Qt::WA_AcceptTouchEvents);

你可能感兴趣的:(Qt)