日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/1/21 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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实现手势缩放和平移(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。