QPainterPath 类为绘画操作提供了一个容器,可以构建和重用图形形状。
画笔路径是由许多图元组成的对象,例如矩形、椭圆、直线和曲线。路径可以连接在封闭的子路径中,例如作为矩形或椭圆。
闭合路径具有重合的起点和终点。或者它们可以作为未闭合的子路径独立存在,例如直线和曲线。
QPainterPath 对象可用于填充、勾画轮廓和裁剪。要给画笔路径生成可填充的轮廓,请使用QPainterPathStroker类。
与普通绘图操作相比,画笔路径的主要优点是复杂的形状只需要创建一次;然后它们可以只调用QPainter::drawPath () 函数多次绘制。
QPainterPath 提供了一组成员函数,可用于获取有关路径及其元素的信息。
此外,还可以使用toReversed () 函数反转元素的顺序。还有几个函数可以将此画笔路径对象转换为多边形表示。
QPainterPath 对象可以构造为具有给定起点的空路径,或构造为另一个 QPainterPath 对象的副本。创建后,可以使用lineTo ()、arcTo ()、cubicTo () 和quadTo () 函数将直线和曲线添加到路径中。
直线和曲线从currentPosition () 延伸到作为参数传递的位置。
QPainterPath 对象的currentPosition () 始终是最后添加的子路径的结束位置(或初始起点)。
使用moveTo () 函数移动currentPosition () 不需要添加组件。
moveTo ( ) 函数隐式地开始一个新的子路径,并关闭前一个。
另一种开始新子路径的方法是调用closeSubpath () 函数,该函数通过从currentPosition () 添加一条线回到路径的起始位置来关闭当前路径。注意,新路径将以 (0, 0) 作为其初始currentPosition ()。
QPainterPath 类还提供了几个方便的函数来向画笔路径添加封闭的子路径:addEllipse ()、addPath ()、addRect ()、addRegion () 和addText ()。addPolygon ( ) 函数添加一个未闭合的子路径。其实这些函数都是moveTo ()、lineTo ()和cubicTo ()操作的集合。
此外,可以使用connectPath () 函数将路径添加到当前路径。但请注意,此函数将通过添加一条线将当前路径的最后一个元素连接到给定路径的第一个元素。
例如:
QPainterPath path;path.addRect(20, 20, 60, 60);path.moveTo(0, 0);path.cubicTo(99, 0, 50, 50, 99, 99);path.cubicTo(0, 99, 50, 50, 0, 0);QPainter painter(this);painter.fillRect(0, 0, 100, 100, Qt::white);painter.setPen(QPen(QColor(79, 106, 25), 1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin));painter.setBrush(QColor(122, 163, 39));painter.drawPath(path);
画笔路径在构建时最初是空的。
我们首先添加一个矩形,它是一个封闭的子路径。然后我们添加两条贝塞尔曲线,它们一起形成一个闭合的子路径,即使它们不是单独闭合的。最后我们绘制整个路径。使用默认填充规则Qt::OddEvenFill填充路径。
Qt 提供了两种填充路径的方法:
Qt::OddEvenFillQt::WindingFill
Qt::OddEvenFill0
指定使用奇偶填充规则填充区域。
有了这个规则,我们就可以用下面的方法判断一个点是否在形状内部。
从该点到形状外的位置绘制一条水平线,并计算交叉点的数量。
如果交叉点的数量是奇数,则该点在形状内部。此模式是默认模式。
Qt::WindingFill1
指定使用非零缠绕规则填充该区域。
有了这个规则,我们就可以用下面的方法判断一个点是否在形状内部。
从点到形状外部的位置画一条水平线。
确定每个交点处的直线方向是向上还是向下。
绕组数由每个交叉点的方向求和确定。
如果数字不为零,则该点位于形状内部。
这种填充模式在大多数情况下也可以被视为闭合形状的交集。
QPainterPath 类提供了一组返回有关路径及其元素的信息的函数。
currentPosition () 函数返回最后添加的子路径的终点(或初始起点)。
elementAt () 函数可用于检索各种子路径元素,
元素的数量可使用elementCount ()函数检索,
而isEmpty () 函数则告知此 QPainterPath 对象是否包含任何元素。
controlPointRect () 函数返回包含此路径中所有点和控制点的矩形。此函数的计算速度明显快于精确的boundingRect (),后者以浮点精度返回此画家路径的边界矩形。
最后,QPainterPath 提供了contains () 函数,可用于确定给定点或矩形是否在路径内,以及 intersects ( ) 函数,可确定给定矩形内的任何点是否也在该路径内。
QPainterPath转换
出于兼容性原因,可能需要简化画家路径的表示:
QPainterPath 提供toFillPolygon ()、toFillPolygons () 和toSubpathPolygons () 函数,将画笔路径转换为多边形。
toFillPolygon () 将画家路径作为一个多边形返回,而后两个函数返回多边形列表。
提供toFillPolygons () 和toSubpathPolygons () 函数是因为绘制几个小多边形通常比绘制一个大多边形更快,即使绘制的点总数相同。
两者之间的区别在于它们返回的多边形数量: toSubpathPolygons () 为每个子路径创建一个多边形,而不管相交的子路径(即重叠的边界矩形),而 toFillPolygons ( ) 函数只为重叠的子路径创建一个多边形。
toFillPolygon () 和toFillPolygons () 函数首先将所有子路径转换为多边形,然后使用倒带技术确保可以使用正确的填充规则填充重叠的子路径。
请注意,倒带会在多边形中插入额外的线,因此填充多边形的轮廓与路径的轮廓不匹配。
QPainterPath例子
Qt 提供了Painter Paths Example和Vector Deformation 示例:
Painter Paths Example展示了如何使用 Painter Paths 来构建复杂的渲染形状,并让用户
尝试填充和描边。
Vector Deformation Example展示了如何使用 QPainterPath 绘制文本。
画笔路径示例矢量变形示例
到此这篇Qpainter应用(qpainterpath)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/kjbd-yiny/56249.html