Qt触摸屏双指缩放和单指移动界面(支持嵌入式设备)

本文介绍的QGraphicsView的双指缩放,QWidget更简单,可以参考当前内容。

1、首先需要打开触摸屏功能。

this->setAttribute(Qt::WA_AcceptTouchEvents);

2、在event事件管理器中接收触摸屏的三个事件,TouchBegin、TouchUpdate和TouchEnd。

3、判断单点触摸还是多点触摸。

4、如果多点触摸,通过比较前后两次两点间触摸位置来判断是放大还是缩小。

5、多点触摸时,会存在抖动情况,需要做防抖处理。

6、如果是单点触摸,通过比较手指放上去的位置和手指拖动时的位置来设置界面滚动条的位置。

代码:

属性设置

clike 复制代码
    this->setAttribute(Qt::WA_AcceptTouchEvents);

缩放和移动逻辑

clike 复制代码
bool MGraaphicsView::event(QEvent *e)
{
    static int index = 0;
    switch (e->type()) {
    case QEvent::TouchBegin:
    case QEvent::TouchUpdate:
    case QEvent::TouchEnd:
    {
        qDebug() <<"CProjectionPicture::event"<<e->type();
        QTouchEvent *touchEvent = static_cast<QTouchEvent *>(e);
        QList<QTouchEvent::TouchPoint> touchPoints = touchEvent->touchPoints();
        if (touchPoints.count() == 2) {
            //缩放
            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 (currentScaleFactor  > _lastScaleFactor)
                index++;
            else if (currentScaleFactor  < _lastScaleFactor)
                index--;
            if (index == 5)//超过5次放大,则认为有效.防抖操作
            {
                index = 0;
                zoomOnce(true);
            }
            else if (index == -5)
            {
                index = 0;
                zoomOnce(false);
            }
            qDebug()<<index<<currentScaleFactor<<_lastScaleFactor;
            _lastScaleFactor = currentScaleFactor;
            update();
        }
        else if (touchPoints.count() == 1)
        {//移动
            const QTouchEvent::TouchPoint &touchPoint = touchPoints.first();
            if (e->type() == QEvent::TouchBegin || e->type() == QEvent::TouchEnd)
                _startScenePos = mapToScene(touchPoint.pos().toPoint());

            if (e->type() == QEvent::TouchUpdate)
            {
                QPointF endScenePos = mapToScene(touchPoint.pos().toPoint());
                QPointF delta = endScenePos - _startScenePos;
                int oposx = this->horizontalScrollBar()->value();
                int oposy = this->verticalScrollBar()->value();
                int nposx = oposx - delta.x();
                int nposy = oposy - delta.y();
                this->horizontalScrollBar()->setValue(nposx);
                this->verticalScrollBar()->setValue(nposy);
            }

            qDebug()<<"====="<<_startScenePos<<touchPoint.pos();
        }
        if (touchEvent->touchPointStates() & Qt::TouchPointReleased)
        {
            qDebug()<<"Qt::TouchPointReleased";
        }
        return true;//一定不要调QGraphicsView::event(e);否则手指触摸会经常失效
    }
    default:
        break;
    }

    return QGraphicsView::event(e);
}

//缩放

clike 复制代码
void MGraaphicsView::zoomOnce(bool increase)
{
    if (increase)
        setZoom(1);
    else
        setZoom(-1);
}

void MGraaphicsView::setZoom(int val)
{
    if (val > 0)
    {
        m_zoom++;
        auto scaleValue = qPow(2, m_zoom);
        setTransform(QTransform::fromScale(scaleValue, scaleValue));
    }
    else
    {
        m_zoom--;
        auto scaleValue = qPow(2, m_zoom);
        setTransform(QTransform::fromScale(scaleValue, scaleValue));
    }
}
相关推荐
沫璃染墨5 小时前
《Qt从零入门系列(十三):QSS样式表详解——从选择器与层叠规则到控件美化实战》
开发语言·css·c++·qt·ui·qt6.3·qss
好好学习O(∩_∩)O10 小时前
[QT] 多线程moveToThread 和易踩的8个坑
开发语言·qt
北i12 小时前
Dubbo 默认超时重试:把下游打雪崩的隐形放大器
开发语言·qt·dubbo
扶尔魔ocy14 小时前
【qt openGL入门笔记】OSG实现显示飞机模型飞行的点迹(二)
qt·opengl·osg
Python图像识别17 小时前
43-【2027毕设】YOLO11暴力检测识别系统 - Python完整源码+PyQt5界面+训练模型+数据集
python·qt·课程设计
bug和崩溃我都要1 天前
QT 开发的专业截图录屏工具 - macOS版 / Windows版
windows·qt·mac·录屏·截屏
Python图像识别1 天前
40-【2027毕设】YOLO11面部口罩检测识别系统 - Python完整源码+PyQt5界面+训练模型+数据集
python·qt·课程设计
Python图像识别1 天前
39-【2027毕设】YOLO11行人摔倒检测系统 - Python完整源码+PyQt5界面+训练模型+数据集
python·qt·课程设计
Quz2 天前
QML PathView:直线路径与曲线路径
qt·动画·qml
扶尔魔ocy2 天前
【qt openGL入门笔记】OSG实现飞机模型在网格图上飞行
qt·opengl·osg