使用Qt怎么实现一个画线笔锋效果?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
创新互联-专业网站定制、快速模板网站建设、高性价比拱墅网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式拱墅网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖拱墅地区。费用合理售后完善,十年实体公司更值得信赖。实现原理
要实现该效果,需要完成以下几个关键步骤:
1.每两个点形成一个贝塞尔曲线path进行绘制
2.最新的一条path绘制细线(笔锋最细处的宽度)
3.倒数第二条path绘制粗线(正常的线条宽度)
4.在两条path连接处补充点使其过渡平滑
接下来一步步的分析,首先第一条,每两个点形成一个贝塞尔曲线path进行绘制,这个比较简单,就不多讲了吧,也就是说,在move事件中,每来一个新点,就让该点和前一个点生成一个贝塞尔曲线,使用QPainterPath中的quadTo
函数,之所以要用贝塞尔曲线,是为了解决折线问题,这个在前面的文章中已经介绍过了。这里就不重复说咯。
我们直接来看第二条: 最新的一个path绘制细线。
这个怎么理解呢?看一个图示:
以上是线条放大的效果,最新的path,也就是上面的newPath,通过当前点和前一个点生成的这条path,绘制一条细线,这条线就作为笔锋,假如这时候抬笔,那么newPath就是最后一条线段,那么笔锋就是这条线来形成的。
做完第二步,我们看一下绘制效果:
第三步:倒数第二条path绘制粗线(正常的线条宽度)
从上面的图示可以看到,我们将最新的newPath绘制细线,那么如果这时候又出现一个新的点,形成了新的path,而之前的newPath就会变成前一个path,这里命名为lastPath,由于该path还是细线,所以这里我们需要将前一个path重新补充绘制成正常的粗线,图示如下:
这里的黄线,也就是我们补充绘制的线条,而最新的path依然是细线,根据以上示意图就很容易明白了。
所以简单来说,就是不断的将最新path绘制成细线,然后将前一个path补充绘制成粗线。
看一下效果:
为了区分不同的path,这里采用了不同的颜色来代表,每一段颜色代表一个path,最新的path就是右边的绿色线条,可以看到最新的path和前一条path由于线宽不同, 所以连接处并不平滑,所以要解决这个问题,需要做最后一步:补点。
什么是补点,就是说我们需要在连接处 根据最新path的线条路径来绘制一系列的点进行填充,使其连接处看起来平滑,图示如下:
上面的圈圈就是补充的点,点与点之间距离越小,看起来就越平滑,而圈圈的圆心点是跟随最新的path线条走的,就是path线的线条高度的中心点,圈圈的半径大小逐渐变小。
再看看补充点后的效果:
可以看到,笔尖黑色的地方线条就是通过补充点来实现的。
那么,问题来了,如何知道最后这条path的路径呢?
其实Qt已经提供了接口,我们通过QPainterPath来生成的曲线,这个类提供了一个函数叫pointAtPercent
,定义如下:
这个接口就是返回在path曲线上的坐标点,通过传入百分比来调用,很方便了吧。
我这里的补充点实现方式,就是通过循环的不断的绘制:
//在两个path连接处绘制补充点,使其连接处平滑 void WbCanvasItem::drawPatchPoint(QPainter * painter,QPainterPath path) { qreal temp = (PENWIDTH-3)/100.; int k = 0; for (qreal i = 0;i < 1; i+=0.01) { k++; painter->setPen(QPen(Qt::black,PENWIDTH-temp*k, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); painter->drawPoint(path.pointAtPercent(i)); } }
前三步骤代码:
QPainterPath lastPath = obj->StrokeLastPath(PENWIDTH); m_pRealPainter->fillPath(lastPath,Qt::red);//填充轮廓 path = obj->StrokePath(3); m_pRealPainter->fillPath(path,Qt::red);//填充轮廓 drawPatchPoint(m_pRealPainter,obj->path());
看完上述内容,你们掌握使用Qt怎么实现一个画线笔锋效果的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联网站建设公司行业资讯频道,感谢各位的阅读!
另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。