Qt QWidget实现手势缩放和平移(二)
生活随笔
收集整理的這篇文章主要介紹了
Qt QWidget实现手势缩放和平移(二)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
上一篇文章中講到了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); 與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Qt QWidget实现手势缩放和平移(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt QWidget实现手势缩放和平移(
- 下一篇: Android Studio运行报错In