上一篇文章中讲到了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);