本應用於基於QGraphicsView框架,實現多點觸摸. 工程僅僅演示了多點觸摸繪圖,源自我前段時間一款基於Qt的繪圖軟件.框架
工程結構:ide
kmp.h 定義了枚舉工具
slide.h/cpp 定義了派生於QGraphicsScene的slide類,實現繪製的主要功能this
widget.h/cpp 定義了派生於QGraphicsView的widget類,多點了多點觸摸部分.spa
kmpinkelement.h/cpp 定義了派生於QGraphicsPathItem的筆跡對象.code
應用實現了抒寫,沒有實現相似其餘工具:橡皮擦,選擇工具,漫遊工具等對象
QGraphicsView的多點觸摸在viewportEvent事件,處理TouchBegin/touchUpdate/TouchEnd事件,在處理touch事件中須要經過判斷每一個點的狀態,同時根據每一個點的ID來實現多點筆跡的管理.blog
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對象,在最後結束繪製後須要畫板上移除集合中全部對象。事件
具體能夠查看源碼,沒有太多複雜的東西element
開發環境: QT5.5 , QtCreator , win7