Qt鼠标触屏绘制平滑曲线,支持矢量非矢量方式
前言
Qt通过鼠标或者触屏,实时绘制平滑曲线,通常有两种方式实现:矢量绘图和非矢量绘图,这两种画线方式从实现上有些不同,其原理也不太一样,稍后会做详细介绍。而鼠标或者触屏画线也不大一样,通常如果只实现鼠标画线的话,那么只需要重新实现鼠标事件即可(mousePressEvent、mouseMoveEvent、mouseReleaseEvent),而要在触控屏上画线,如果需要支持多点画线的话,就必须处理QTouchEvent事件才行,但是如果触屏上只支持单点画线,那也可以直接实现鼠标事件,因为第一个触点的事件会同时进入到QTouchEvent和Mouse事件中。QTouchEvent中可以区分出多点时每个触点的id,通过id进行区分每个点的数据。
通常情况下,为了提升绘图效率,要实现这种绘图的功能,都是用QGraphics体系来完成,因为QGraphics刷新机制和QWidget不太一样,它可以做区域刷新,这样能保证效率更高,特别是针对一些分辨率较高的设备,就很明显了。具体这两个体系间的区别就不在这里进行描述。
所以,接下来为了演示矢量和非矢量画图方式,我们在QGraphics体系中实现一个简单的画板程序。注重画线效率,保证线条平滑无折线,无锯齿,支持多点画线。效果图
先来看看非矢量绘图的效果:
再看矢量绘图效果:
二者区别
通过上面的两个图对比,相信大家已经看出了一些区别。我们再详细介绍一下这两者的区别。
非矢量绘图
优点:速度快。非矢量绘图原理是直接在一张图片上进行绘制,其渲染速度很快,即便是画了很多线条,也不会有卡顿的效果,擦除时同样很快。
缺点:缩放失真。由于非矢量绘图是在图片上渲染,当缩放图片时,会导致线条模糊不清晰,如果只是小范围的缩放还能接受,无限缩放的话就会很明显了。二者区别
通过上面的两个图对比,相信大家已经看出了一些区别。我们再详细介绍一下这两者的区别。
非矢量绘图
优点:速度快。非矢量绘图原理是直接在一张图片上进行绘制,其渲染速度很快,即便是画了很多线条,也不会有卡顿的效果,擦除时同样很快。
缺点:缩放失真。由于非矢量绘图是在图片上渲染,当缩放图片时,会导致线条模糊不清晰,如果只是小范围的缩放还能接受,无限缩放的话就会很明显了。
矢量绘图
优点:无限缩放,不失真。矢量绘图是将点数据绘制生成一个单独的对象,当进行缩放的时候,会重新进行渲染,所以矢量绘图的方式不会导致图像失真。
缺点:线条多时会卡顿,擦除尤其明显。由于矢量绘图是生成一个单独的对象,所以当画线多的情况下,会触发所有有交集的对象进行刷新,擦除的时候,会去计算线条之间的交集并做删减,这个过程会很慢,并且会将整个对象item进行刷新,所以卡顿明显(上述效果图就可以看出来了)。
通过以上两者的优缺点对比,根据实际需要进行选择实际的画线模式。
解决实时绘图折线问题
折线效果:
可以看到上述画线有很明显的折线,线条不平滑。
通常绘制这种线条,第一反应想到的是讲两个点直接连接起来行成一条直线,但是,由于两点之间距离比较大,特别是触控屏,点与点之间并不是很密集,因为上层应用在主线程渲染的时候,系统会自动丢弃一些数据点,即便是底层上报的点很多,上层应用接收到的点也会减少,所以不能直接用连接两点的方式来实现。
那么,该怎么解决呢?
绘制贝塞尔曲线。
在move的过程中实时生成贝塞尔曲线path,这样就能保证线条无折线。QPainterPath支持贝塞尔曲线绘制,参加以下函数:voidQPainterPath::quadTo(constQPointFc,constQPointFendPoint)AddsaquadraticBeziercurvebetweenthecurrentpositionandthegivenendPointwiththecontrolpointspecifiedbyc。Afterthecurveisadded,thecurrentpointisupdatedtobeattheendpointofthecurve。
非矢量绘图实现方式
所谓的非矢量绘图,就是在一张图片上进行绘制,然后将图片渲染到QGraphicsItem的背景上面,前面我们已经提到,该方式渲染速度非常快,无论画多少线条都不会影响速度,而擦除功能只需要按照同样的方式绘制背景色即可。
但是该方式在缩放过后图片会有些模糊,如果只是小范围的缩放还好,无限缩放就需要用到矢量绘图的方式了。
矢量绘图实现方式
相比之下,矢量绘图就会稍微麻烦一点,所谓矢量绘图,就是将path曲线直接生成一个独立的对象,将该对象添加到scene中,这种模式下会有一个缺陷,就是当画线较多的情况下,刷新会比较慢,因为会导致整条曲线(只要有交集)刷新,从而导致卡顿的效果,并且在擦除时,需要实时计算擦除的path与实际线条path的交集,然后进行计算,减去擦除的path,这个过程是最耗时的,并且也会引发整个item刷新。前面写过文章介绍QGraphics体系的刷新机制
双缓冲绘图
上面介绍到,通过非矢量绘图的方式,速度会非常快,那么双缓冲绘图就是要结合非矢量来进行,其原理就是:在press事件中生成一条path,接着move中动态增加这条path,然后在临时层上进行非矢量绘图,这时候绘制的速度会非常快,最后在release事件中将完整的path绘制成矢量图,然后将临时层画线清空。基本原理就是这样。
双缓冲绘图方式,在绘制过程中是通过非矢量的方式在临时层进行,release后生成完整的矢量path,这种方式速度会非常快,并且直接绘制完整的一条path不会有锯齿。所以这是最佳选择。
【领QT开发教程学习资料,点击下方链接莬费领取,先码住不迷路】
点击这里:链接
梦幻西游神木林109怎么堆法伤?感谢邀请,我是梧桐,还望多多关注梦幻西游109级主流法系无外乎魔王神木林以及龙宫,除此之外还有一些如魔化生魔方寸这样的非主流法系,女魃墓几乎很少能够遇到。而主流法系中相较于魔王和龙
住在顶楼,水压不够,用不了热水器,怎么办?家里的水压不够确实很糟心,这种问题一般都是出现在高层的老楼房中,其它的地方虽然也有但是出现的几率不大,这也是个人一直不喜欢高层顶楼的原因之一。那么住在顶楼,水压不够用不了热水器怎么
如何辨别上市公司好坏?如何辨别上市公司好坏?这个问题,我相信非常多的股民朋友都非常关心的。那如何来判断上市公司好坏呢,其实我觉得还是很简单的。接下来我来说说自己的一些心得,当然尽量是简练一点,用好股票分
都说代账公司是会计的一条不归路,你怎么看?关于这个问题回答1。这种说法个人不敢苟同。应该理性看待代账公司这个行业。代账公司包括代账会计对减轻小微企业的财务核算纳税申报成本可以说有很大的帮助作用。特别是一些初创企业,如果聘用
日产尼桑质量如何?日产正在一步步沦为平庸廉价的汽车品牌,虽然销量表现依然不错,但是无论是技术水平质量稳定性都在不断下滑。以前的日产车,可能在很多人眼里质量稳定舒适安静,但是如今的日产车,已经一步步沦
哪些海鲜是湛江独有而他处无法享受的?湛江是中国海鲜之都的说法不准确。中国那么大,江河湖海很多,各地海鲜河鲜也是各有特色,没有哪个城市是可以称为海鲜之都的!严格来说,湛江可以称为中国的对虾养殖之都。因为湛江及周边区域是
乌鲁木齐到拉萨自驾游怎么走,(走青藏公路)几天能到,沿途有什么风景?西藏,新疆都呆过几个月,青藏线也走过几回,所以对这条路线算是比较熟悉的,乌鲁木齐走青藏线到拉萨,推荐两条路线。路线一一路线乌鲁木齐哈密敦煌(兰州西宁(青海湖茶卡盐湖))格尔木(察尔
未来几年,阿里巴巴的营收会超越同样高度发展的华为吗?目前来看,华为是比阿里强太多了。可以说,未来几年内,阿里巴巴是无法超过华为,甚至和华为站在同样高度的。甚至,有一些方面,可能是阿里一辈子都无法超越华为的。我们从几点来深入分析一下第
华为跌倒,苹果吃饱!苹果13开卖即售罄,谁该感到尴尬?为什么要买华为,买苹果手机就是好用,就好比买车,满大街跑的有几辆国产车,清华大学的学生为什么去美国,而不留在中国中国人再不团结,将来不排除被侵略的可能,我就怀疑那些拿着苹果手机人的
宫颈鳞状上皮病变用什么药比较好?能治愈吗?可以治愈,但是没有药物治疗!宫颈鳞状上皮病变一般分为3级,其中1级是不用治疗的,可以通过自身的免疫力进行自愈,而宫颈病变3级比较临近宫颈癌,但是单单靠药物也是不能痊愈的,只能依靠手
如果我置身于英语环境中,听到看到的全是英语,久而久之我能掌握英语吗?如果一个人置身于英语环境中,听到看到的全是英语,久而久之,他肯定能熟练掌握英语的听说技能,但是不代表他就完全掌握了英语。现实当中有许多这样学习语言的例子,让我们从中借鉴一些学习英语