QT:触摸屏支持手指触摸,增加touch事件touchevent,记录前后touch坐标并处理
生活随笔
收集整理的這篇文章主要介紹了
QT:触摸屏支持手指触摸,增加touch事件touchevent,记录前后touch坐标并处理
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
QT:觸摸屏支持手指觸摸,增加touch事件touchevent,記錄前后touch坐標(biāo)并處理
- 1、手指觸摸事件當(dāng)做鼠標(biāo)事件去響應(yīng)的可行性
- 2、觸摸事件touchEvent的添加
- 3、重寫touch事件
1、手指觸摸事件當(dāng)做鼠標(biāo)事件去響應(yīng)的可行性
目前所見,有的QT關(guān)于觸摸屏觸摸事件的處理,是把手指點擊屏幕的行為,作為鼠標(biāo)事件去處理的,這樣的情況在大部分場景是可以“應(yīng)付應(yīng)付”的,但是如果在如下場景(可能更多)這樣的處理顯然就不滿足了。
比如如下場景:【手指點擊空白處退出當(dāng)前的窗口】;
是鼠標(biāo)點擊的話,假設(shè)沒有移動,MouseButtonPress 和 MouseButtonRelease記錄的坐標(biāo)point其實是同一個點,這樣的判斷是沒有問題的。
可是,如果現(xiàn)在手指點擊,手指和觸摸屏的接觸點可就不一樣了,手指接觸屏幕上去就不是一個點了。這個場景下,就需要touchevent事件,去處理手指觸摸事件了。
2、觸摸事件touchEvent的添加
首先,讓在需要加touch事件的控件能夠接收touch;
this->setAttribute(Qt::WA_AcceptTouchEvents);隨后,事件過濾器增加如下三個事件,就好了,一般都是重寫一下
TouchBegin // 開始觸摸 TouchUpdate // 狀態(tài)更新,不如手指滑動之類的 TouchEnd // 手指松開,結(jié)束觸摸3、重寫touch事件
頭文件如下:
private:bool touchBeginEventProcess(QEvent *event);bool touchUpdateEventProcess(QEvent *event);bool touchEndEventProcess(QEvent *event);函數(shù),事件過濾器:
bool WidgetTouch::eventFilter(QObject *object, QEvent *event) {if (object == this) {switch (event->type()){case QEvent::TouchBegin:return touchBeginEventProcess(event);case QEvent::TouchUpdate:return touchUpdateEventProcess(event);case QEvent::TouchEnd:return touchEndEventProcess(event); ............... // 剩下事件的處理~ .......... ....... } bool WidgetTouch::touchBeginEventProcess(QEvent *event) {QTouchEvent *touchEvent = static_cast<QTouchEvent *>(event);QList<QTouchEvent::TouchPoint> touchStartPoints = touchEvent->touchPoints();startPoint = touchStartPoints.at(0).screenPos().toPoint(); // touch開始觸控的點坐標(biāo)touchEvent->accept();return true; }bool WidgetTouch::touchUpdateEventProcess(QEvent *event) {QTouchEvent *touchEvent = static_cast<QTouchEvent *>(event);QList<QTouchEvent::TouchPoint> touchUpdatePoints = touchEvent->touchPoints();// 設(shè)置單指觸控,還是多指觸控if (TOUCH_ONE_POINT == touchUpdatePoints.count()) { // 假設(shè)此時場景,手指滑動了QPoint nowPoint = touchUpdatePoints.at(0).screenPos().toPoint(); // screenPos 當(dāng)前坐標(biāo)的位置QPoint lastPoint = touchUpdatePoints.at(0).lastScreenPos().toPoint(); // 上一次坐標(biāo)的位置endPoint = nowPoint; // 手指滑動后,記錄一下最后松開的 坐標(biāo)位置}return true; }bool WidgetTouch::touchEndEventProcess(QEvent *event) {QTouchEvent *touchEvent = static_cast<QTouchEvent *>(event);// 這里或者 touchUpdateEventProcess 當(dāng)中去處理,根據(jù)初始和結(jié)束坐標(biāo),做其它處理/* 比如上述touch空白處退出窗口的需求,根據(jù)前后坐標(biāo),滿足設(shè)定的閾值(10 - 20 像素就好),就釋放退出信號*/touchEvent->accept();return true; }其它的處理,內(nèi)容,在此時就可以使用 F1 去查看官方幫助文檔了,作用和解釋都很詳細(xì)
以上,就是增加touch事件touchevent的大概邏輯框架了。
如果更復(fù)雜的事件,就建議去使用手勢事件-QGesture了。
總結(jié)
以上是生活随笔為你收集整理的QT:触摸屏支持手指触摸,增加touch事件touchevent,记录前后touch坐标并处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 双指针算法之快慢指针(一):力扣【判断链
- 下一篇: QT使用之 手指滑动 | 物理惯性继续滑