QT:触摸屏支持手指触摸,增加touch事件touchevent,记录前后touch坐标并处理
1、手指触摸事件当做鼠标事件去响应的可行性
目前所见,有的QT关于触摸屏触摸事件的处理,是把手指点击屏幕的行为,作为鼠标事件去处理的,这样的情况在大部分场景是可以“应付应付”的,但是如果在如下场景(可能更多)这样的处理显然就不满足了。
比如如下场景:【手指点击空白处退出当前的窗口】;
是鼠标点击的话,假设没有移动,MouseButtonPress 和 MouseButtonRelease记录的坐标point其实是同一个点,这样的判断是没有问题的。
可是,如果现在手指点击,手指和触摸屏的接触点可就不一样了,手指接触屏幕上去就不是一个点了。这个场景下,就需要touchevent事件,去处理手指触摸事件了。
2、触摸事件touchEvent的添加
首先,让在需要加touch事件的控件能够接收touch;
this->setAttribute(Qt::WA_AcceptTouchEvents);
随后,事件过滤器增加如下三个事件,就好了,一般都是重写一下
TouchBegin // 开始触摸
TouchUpdate // 状态更新,不如手指滑动之类的
TouchEnd // 手指松开,结束触摸
3、重写touch事件
头文件如下:
private:
bool touchBeginEventProcess(QEvent *event);
bool touchUpdateEventProcess(QEvent *event);
bool touchEndEventProcess(QEvent *event);
函数,事件过滤器:
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开始触控的点坐标
touchEvent->accept();
return true;
}
bool WidgetTouch::touchUpdateEventProcess(QEvent *event)
{
QTouchEvent *touchEvent = static_cast<QTouchEvent *>(event);
QList<QTouchEvent::TouchPoint> touchUpdatePoints = touchEvent->touchPoints();
// 设置单指触控,还是多指触控
if (TOUCH_ONE_POINT == touchUpdatePoints.count()) {
// 假设此时场景,手指滑动了
QPoint nowPoint = touchUpdatePoints.at(0).screenPos().toPoint(); // screenPos 当前坐标的位置
QPoint lastPoint = touchUpdatePoints.at(0).lastScreenPos().toPoint(); // 上一次坐标的位置
endPoint = nowPoint; // 手指滑动后,记录一下最后松开的 坐标位置
}
return true;
}
bool WidgetTouch::touchEndEventProcess(QEvent *event)
{
QTouchEvent *touchEvent = static_cast<QTouchEvent *>(event);
// 这里或者 touchUpdateEventProcess 当中去处理,根据初始和结束坐标,做其它处理
/* 比如上述touch空白处退出窗口的需求,根据前后坐标,满足设定的阈值(10 - 20 像素就好),就释放退出信号*/
touchEvent->accept();
return true;
}
其它的处理,内容,在此时就可以使用 F1 去查看官方帮助文档了,作用和解释都很详细
以上,就是增加touch事件touchevent的大概逻辑框架了。
如果更复杂的事件,就建议去使用手势事件-QGesture了。