本应用于基于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() == ){
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

源码


基于Qt QGraphicsView的多点触摸绘图的更多相关文章

  1. 【转】基于Qt, TUIO和TSLIB的嵌入式Linux下的多点触摸设计

    这个教程描述了在嵌入式linux下使用Qt如何设置一个支持多点触摸和单点触摸的输入系统.这里假定你已经有了对应的驱动程序,驱动可以从触摸屏的厂商那里获得或者使用一个linux 内核源码中已经存在的驱动 ...

  2. 采用Qt快速绘制多条曲线(折线),跟随鼠标动态显示线上点的值(基于Qt的开源绘图控件QCustomPlot进行二次开发)

    QCustomPlot是一个开源的基于Qt的第三方绘图库,能够绘制漂亮的2D图形. QCustomPlot的官方网址:https://www.qcustomplot.com/ 从官网下载QCustom ...

  3. 多点触摸画板(MultiTouchCanvas)

    这是个简单的支持多点触摸的画板控件, 绘制功能基于WPF InkCanvas,也是我drawTool系列文章的开篇. 阅读该文章后可能产生一些问题: 1. 如果对生成的笔迹对象进行控制 如果要对生成的 ...

  4. 让qt应用程序支持触摸

    一.设备驱动 我的触摸屏是usb接口的 可以参考下这2篇文件 http://blog.csdn.net/paomadi/article/details/8754783 usb触摸屏 http://bl ...

  5. Qt Creator中的3D绘图及动画教程(参照NeHe)

    Qt Creator中的3D绘图及动画教程(参照NeHe) http://blog.csdn.net/cly116/article/details/47184729 刚刚学习了Qt Creator,发 ...

  6. CTP多点触摸协议【转】

    转自:http://blog.chinaunix.net/uid-26403844-id-5063920.html linux kernel 2.6.30开始对多点触摸支持,最近高通要求所有CTP器件 ...

  7. Linux & Android 多点触摸协议

    Linux & Android 多点触摸协议 Android4.0多点触摸入门 1 KERNEL 对于触摸屏的驱动我们简单的划分为两个主要的部分,一个是注册,另一个是上报. 1.1 注册 单点 ...

  8. 多点触摸(MT)协议(翻译)

    参考: http://www.kernel.org/doc/Documentation/input/multi-touch-protocol.txt 转自:http://www.arm9home.ne ...

  9. 移动web开发,12个触摸及多点触摸事件常用Js插件

    如今移动互联网已经占据了主流地位,越来越多的开发者开始从桌面转向移动平台.与桌面开发不同的是,在移动领域中,不同的操作系统.大量不同屏幕尺寸的移动设备.触摸手势操作等,这都给开发者带来了一定的难度和挑 ...

随机推荐

  1. 在MacOSX下使用Github管理Xcode代码

    版本控制应该算是每个程序员所必备的技能,这个重要性,我就不多说了哈.现在版本控制基本上就是两种途径:SVN和Git.对于SVN我并不是非常了解,只知道在Windows下非常实用,但是在MacOSX下, ...

  2. zabbix 编译

    yum -y install xml* libxml* net-snmp net-snmp* php-bcmath ./configure --enable-server --enable-agent ...

  3. hdoj 4324 Triangle LOVE【拓扑排序判断是否存在环】

    Triangle LOVE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  4. 黑马程序员_<<GUI(图形用户管理)-----2>>

    --------------------ASP.Net+Android+IOS开发..Net培训.期待与您交流! -------------------- 8.对话框 对列出目录内容增加了对话框提示, ...

  5. Oracle Hint 详解

    Hint 是Oracle 提供的一种SQL语法,它允许用户在SQL语句中插入相关的语法,从而影响SQL的执行方式. 因为Hint的特殊作用,所以对于开发人员不应该在代码中使用它,Hint 更像是Ora ...

  6. array_column php 函数 自定义版本 php_version<5.5

    <?php if(!function_exists('array_column')) { /* * array_column() for PHP 5.4 and lower versions * ...

  7. SQL 存储过程 通过多个ID更新数据 分类: SQL Server 2014-12-08 16:08 299人阅读 评论(0) 收藏

    下面举个例子说明: 我想让一部分品牌的名称(即Brand_Name)后面加上1,Brand_ID是主键,sql语句很容易实现,但是存储过程如何写呢? 错误写法如下: //*************** ...

  8. 【设计模式 - 3】之建造者模式(Builder)

    1      模式简介 建造者模式也叫生成器模式,和抽象工厂模式相似,也是一种构建复杂对象的模式. 建造者模式中的角色分类: 抽象建造者Builder:接口类型,用于规范各个产品的组成部分: 具体建造 ...

  9. 20169210《Linux内核原理与分析》第三周作业

    本次作业也是分为两部分,第一部分是对实验楼<Linux基础入门>复习,第二部分为对课本18章的复习. 第一次学习实验楼的<Linux基础入门>时由于是第一次接触Linux,所以 ...

  10. LeetCode——Linked List Cycle

    Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using ex ...