基于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

 

源码



http://www.cnblogs.com/visonme/p/5435330.html

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值