QT:触摸屏支持手指触摸,增加touch事件touchevent,记录前后touch坐标并处理

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了。

猜你喜欢

转载自blog.csdn.net/qq_43473694/article/details/110404963