zoukankan      html  css  js  c++  java
  • 基于Qt QGraphicsView的多点触摸绘图

    本应用于基于QGraphicsView框架,实现多点触摸. 工程仅仅演示了多点触摸绘图,源自我前段时间一款基于Qt的绘图软件.

    工程结构:


    kmp.h 定义了枚举

    slide.h/cpp 定义了派生于QGraphicsScene的slide类,实现绘制的主要功能

    widget.h/cpp 定义了派生于QGraphicsView的widget类,多点了多点触摸部分.

    kmpinkelement.h/cpp 定义了派生于QGraphicsPathItem的笔迹对象.

    应用实现了抒写,没有实现类似其他工具:橡皮擦,选择工具,漫游工具等

    QGraphicsView的多点触摸在viewportEvent事件,处理TouchBegin/touchUpdate/TouchEnd事件,在处理touch事件中需要通过判断每个点的状态,同时根据每个点的ID来实现多点笔迹的管理.

    bool Widget::viewportEvent(QEvent *event){
        // 处理touch事件
        QEvent::Type evType = event->type();
        if(evType==QEvent::TouchBegin || evType == QEvent::TouchUpdate || evType == QEvent::TouchEnd )
        {
            QTouchEvent* touchEvent = static_cast<QTouchEvent*>(event);
            QList<QTouchEvent::TouchPoint> touchPoints = touchEvent->touchPoints();
    
            foreach( const QTouchEvent::TouchPoint tp , touchPoints ){
                //不考虑pad
                QPoint touchPos  = QPoint( tp.pos().x() , tp.pos().y() );
                if(tp.id() == 0 ){
                    if( tp.state() == Qt::TouchPointPressed )
                        this->_isTouchMode = true;
                    else
                        this->_isTouchMode = false;
                }
    
                QPointF scenepos = this->mapToScene(touchPos.x() , touchPos.y() );
                switch( tp.state() ){
                case Qt::TouchPointPressed:
                    this->_currentSlide->onDeviceDown(scenepos, tp.id());
                    break;
                case Qt::TouchPointMoved:
                    this->_currentSlide->onDeviceMove(scenepos,tp.id());
                    break;
                case Qt::TouchPointReleased:
                    this->_currentSlide->onDeviceUp(tp.id());
                    break;
                }
    
            }
    
            if(evType == QEvent::TouchEnd ){
                // to do
            }
    
            return true;
        }
    
        return QGraphicsView::viewportEvent(event);
    }

    书写我们是基于QGraphiscLineItem的,书写结束后我们才生成KMPInkElement,所以在slide类中我们看到我们有一个std::vector集合来存储绘制过程中添加产生的QGraphicsLineItem对象,在最后结束绘制后需要画板上移除集合中所有对象。

    具体可以查看源码,没有太多复杂的东西

    开发环境: QT5.5 ,  QtCreator , win7

    源码


     

  • 相关阅读:
    ES6获取页面所有页面标签名
    改变this对象的指向
    构造函数及原型
    全局对象this转为局部对象
    节点注意的问题
    Spark研究笔记17:设置 CVT
    Spark研究笔记15:资源 CVT
    Spark研究笔记13:Swing 组件类 CVT
    Spark研究笔记16:搜索 CVT
    Spark研究笔记19:插件体系开发 CVT
  • 原文地址:https://www.cnblogs.com/visonme/p/5435330.html
Copyright © 2011-2022 走看看