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

来源:互联网 发布:win764位精简优化版 编辑:程序博客网 时间:2024/05/16 08:18

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

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


关键代码如下:

bool CProjectionPicture::event(QEvent *event){//    if (event->type() == QEvent::Gesture)//        return gestureEvent(static_cast<QGestureEvent*>(event));    switch (event->type()) {    case QEvent::TouchBegin:    case QEvent::TouchUpdate:    case QEvent::TouchEnd:    {        qDebug() <<"CProjectionPicture::event";        QTouchEvent *touchEvent = static_cast<QTouchEvent *>(event);        QList<QTouchEvent::TouchPoint> 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);

0 0
原创粉丝点击