qpainterpath 平移(qpainter旋转)

qpainterpath 平移(qpainter旋转)div style width 656px margin 0 padding 0 height 0 div lt

大家好,我是讯享网,很高兴认识大家。




讯享网

 <tbody> <tr> <td id="artContent" style="max-width: 656px;"> <div style="width: 656px; margin: 0; padding: 0; height: 0;"></div> <p>QPainterPath 类为绘画操作提供了一个容器,可以构建和重用图形形状。</p><p><span style="color: rgb(64, 66, 68);background-color: rgb(255, 255, 255);"></span></p><p>画笔路径是由许多图元组成的对象,例如矩形、椭圆、直线和曲线。路径可以连接在封闭的子路径中,例如作为矩形或椭圆。</p><p>闭合路径具有重合的起点和终点。或者它们可以作为未闭合的子路径独立存在,例如直线和曲线。</p><p style="margin-right: 0px;margin-bottom: 1.5em;margin-left: 0px;border: 0px;vertical-align: baseline;color: rgb(64, 66, 68);white-space: normal;background-color: rgb(255, 255, 255);"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">QPainterPath 对象可用于填充、勾画轮廓和裁剪。要给<span style="color: rgb(64, 66, 68);background-color: rgb(255, 255, 255);">画笔</span>路径生成可填充的轮廓,请使用</span>QPainterPathStroker<span style="vertical-align: inherit;">类。</span></span></p><p style="margin-right: 0px;margin-bottom: 1.5em;margin-left: 0px;border: 0px;vertical-align: baseline;color: rgb(64, 66, 68);white-space: normal;background-color: rgb(255, 255, 255);"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">与普通绘图操作相比,画笔路径的主要优点是复杂的形状只需要创建一次;然后它们可以只调用</span>QPainter::drawPath&nbsp;() 函数多次绘制。</span></p><p style="margin-right: 0px;margin-bottom: 1.5em;margin-left: 0px;border: 0px;vertical-align: baseline;color: rgb(64, 66, 68);white-space: normal;background-color: rgb(255, 255, 255);"><span style="vertical-align: inherit;">QPainterPath 提供了一组成员函数,可用于获取有关路径及其元素的信息。</span></p><p style="margin-right: 0px;margin-bottom: 1.5em;margin-left: 0px;border: 0px;vertical-align: baseline;color: rgb(64, 66, 68);white-space: normal;background-color: rgb(255, 255, 255);"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">此外,还可以使用</span>toReversed<span style="vertical-align: inherit;">&nbsp;() 函数反转元素的顺序。还有几个函数可以将此<span style="color: rgb(64, 66, 68);background-color: rgb(255, 255, 255);">画笔</span>路径对象转换为多边形表示。</span></span></p><p>QPainterPath 对象可以构造为具有给定起点的空路径,或构造为另一个 QPainterPath 对象的副本。创建后,可以使用lineTo&nbsp;()、arcTo&nbsp;()、cubicTo&nbsp;() 和quadTo&nbsp;() 函数将直线和曲线添加到路径中。</p><p><span style="color: rgb(255, 0, 0);">直线和曲线从currentPosition&nbsp;() 延伸到作为参数传递的位置。</span></p><p>QPainterPath 对象的currentPosition () 始终是最后添加的子路径的结束位置(或初始起点)。</p><p>使用moveTo&nbsp;() 函数移动currentPosition&nbsp;() 不需要添加组件。</p><p>moveTo&nbsp;(&nbsp;) 函数隐式地开始一个新的子路径,并关闭前一个。</p><p>另一种开始新子路径的方法是调用closeSubpath () 函数,该函数通过从currentPosition&nbsp;() 添加一条线回到路径的起始位置来关闭当前路径。注意,新路径将以 (0, 0) 作为其初始currentPosition&nbsp;()。</p><p>QPainterPath 类还提供了几个方便的函数来向画笔路径添加封闭的子路径:addEllipse&nbsp;()、addPath&nbsp;()、addRect&nbsp;()、addRegion&nbsp;() 和addText&nbsp;()。addPolygon&nbsp;(&nbsp;) 函数添加一个未闭合的子路径。其实这些函数都是moveTo&nbsp;()、lineTo&nbsp;()和cubicTo&nbsp;()操作的集合。</p><p style="margin-right: 0px;margin-bottom: 1.5em;margin-left: 0px;border: 0px;vertical-align: baseline;color: rgb(64, 66, 68);white-space: normal;background-color: rgb(255, 255, 255);"><span style="vertical-align: inherit;">此外,可以使用connectPath</span><span style="vertical-align: inherit;">&nbsp;() 函数将路径添加到当前路径。但请注意,此函数将通过添加一条线将当前路径的最后一个元素连接到给定路径的第一个元素。</span></p><p style="margin-right: 0px;margin-bottom: 1.5em;margin-left: 0px;border: 0px;vertical-align: baseline;color: rgb(64, 66, 68);white-space: normal;background-color: rgb(255, 255, 255);">例如:<br></p><p></p><p></p><p style="margin: 1.5em 0px;border: 0px;vertical-align: baseline;color: var(--main-color) ;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">画笔路径在构建时最初是空的。</span></span></p><p style="margin: 1.5em 0px;border: 0px;vertical-align: baseline;color: var(--main-color) ;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">我们首先添加一个矩形,它是一个封闭的子路径。然后我们添加两条贝塞尔曲线,它们一起形成一个闭合的子路径,即使它们不是单独闭合的。最后我们绘制整个路径。</span>使用默认填充规则Qt::OddEvenFill<span style="vertical-align: inherit;">填充路径。</span></span></p><p style="margin: 1.5em 0px;border: 0px;vertical-align: baseline;color: var(--main-color) ;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Qt 提供了两种填充路径的方法:</span></span></p><div style="color: rgb(64, 66, 68); margin: 0px 0px 5px; padding: 0px; border: 1px solid var(--content-border-color) ; border-collapse: collapse; border-spacing: 0px; vertical-align: initial;" width="660"><thead style="margin: 0px; padding: 0px 0px 0px 20px; border: 0px;"></thead><tbody style="margin: 0px; padding: 0px; border: 0px;"><tr valign="top" style="margin: 0px; padding: 0px; border: 0px;"><td style="margin: 0px; padding: 5px 20px; border: 1px solid var(--content-border-color) ; line-height: 1.3; text-align: inherit;" width="312"><img doc360img-src='http://image109.360doc.com/DownloadImg/2023/03/0214/_1_10498.png' alt="" src="http://image109.360doc.com/DownloadImg/2023/03/0214/_1_10498.png" style="margin: 0px; padding: 0px; border-width: 0px; border-style: initial; vertical-align: baseline; max-width: initial;">&nbsp;&nbsp;</td><td width="312"><img doc360img-src='http://image109.360doc.com/DownloadImg/2023/03/0214/_2_.png' alt="" src="http://image109.360doc.com/DownloadImg/2023/03/0214/_2_.png" style="margin: 0px; padding: 0px; border-width: 0px; border-style: initial; vertical-align: baseline; max-width: initial;"></td></tr></tbody></div><div style="margin: 0px 0px 5px; padding: 0px; border: 1px solid var(--content-border-color) ; border-collapse: collapse; border-spacing: 0px; vertical-align: initial; font-family: &quot;Titillium Web&quot;, Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);" width="1000"><tbody style="margin: 0px; padding: 0px; border: 0px;"><tr style="margin: 0px; padding: 0px; border: 0px;"><td style="margin: 0px; padding: 5px 20px; border: 1px solid var(--content-border-color) ; font-size: 0.75em; line-height: 1.3; text-align: inherit;"><span style="font-size: 16px;"><strong></strong></span></td><td style="margin: 0px; padding: 5px 20px; border: 1px solid var(--content-border-color) ; font-size: 0.75em; line-height: 1.3; text-align: inherit;"><span style="font-size: 16px;"><strong></strong></span></td><td style="margin: 0px; padding: 5px 20px; border: 1px solid var(--content-border-color) ; line-height: 1.3; text-align: inherit;"><p><span style="vertical-align: inherit; color: rgb(255, 0, 0);">指定使用非零缠绕规则填充该区域。</span></p><p><span style="vertical-align: inherit;">有了这个规则,我们就可以用下面的方法判断一个点是否在形状内部。</span></p><p><span style="vertical-align: inherit;">从点到形状外部的位置画一条水平线。</span></p><p><span style="vertical-align: inherit;">确定每个交点处的直线方向是向上还是向下。</span></p><p><span style="vertical-align: inherit;">绕组数由每个交叉点的方向求和确定。</span></p><p><span style="vertical-align: inherit;">如果数字不为零,则该点位于形状内部。</span></p><p><span style="vertical-align: inherit;">这种填充模式在大多数情况下也可以被视为闭合形状的交集。</span></p></td></tr></tbody></div><p>currentPosition () 函数返回最后添加的子路径的终点(或初始起点)。</p><p>elementAt&nbsp;() 函数可用于检索各种子路径元素,</p><p>元素的数量可使用elementCount ()函数检索,</p><p>而isEmpty&nbsp;() 函数则告知此 QPainterPath 对象是否包含任何元素。</p><p>controlPointRect () 函数返回包含此路径中所有点和控制点的矩形。此函数的计算速度明显快于精确的boundingRect&nbsp;(),后者以浮点精度返回此画家路径的边界矩形。</p><p>最后,QPainterPath 提供了contains&nbsp;() 函数,可用于确定给定点或矩形是否在路径内,以及 intersects&nbsp;(&nbsp;) 函数,可确定给定矩形内的任何点是否也在该路径内。</p><p style="margin-right: 0px;margin-bottom: 1.5em;margin-left: 0px;border: 0px;vertical-align: baseline;color: var(--main-color) ;"><span style="vertical-align: inherit;">出于兼容性原因,可能需要简化画家路径的表示:</span></p><p style="margin-right: 0px;margin-bottom: 1.5em;margin-left: 0px;border: 0px;vertical-align: baseline;color: var(--main-color) ;"><span style="vertical-align: inherit;">QPainterPath 提供</span><span style="vertical-align: inherit;">toFillPolygon</span><span style="vertical-align: inherit;">&nbsp;()、</span><span style="vertical-align: inherit;">toFillPolygons</span><span style="vertical-align: inherit;">&nbsp;() 和</span><span style="vertical-align: inherit;">toSubpathPolygons</span><span style="vertical-align: inherit;">&nbsp;() 函数,将画笔路径转换为多边形。</span></p><p style="margin-right: 0px;margin-bottom: 1.5em;margin-left: 0px;border: 0px;vertical-align: baseline;color: var(--main-color) ;"><span style="vertical-align: inherit;">toFillPolygon&nbsp;() 将画家路径作为一个多边形返回,而后两个函数返回多边形列表</span><span style="vertical-align: inherit;">。</span><span style="vertical-align: inherit;"></span></p><p>提供toFillPolygons&nbsp;() 和toSubpathPolygons () 函数是因为绘制几个小多边形通常比绘制一个大多边形更快,即使绘制的点总数相同。</p><p>两者之间的区别在于它们返回的多边形数量:&nbsp;toSubpathPolygons&nbsp;() 为每个子路径创建一个多边形,而不管相交的子路径(即重叠的边界矩形),而 toFillPolygons&nbsp;(&nbsp;) 函数只为重叠的子路径创建一个多边形。<span style="vertical-align: inherit;"></span><span style="vertical-align: inherit;"></span><em style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;"><span style="vertical-align: inherit;"></span></em><span style="vertical-align: inherit;"></span><span style="vertical-align: inherit;"></span><span style="vertical-align: inherit;"></span><span style="vertical-align: inherit;"></span><span style="vertical-align: inherit;"></span></p><p style="margin-right: 0px;margin-bottom: 1.5em;margin-left: 0px;border: 0px;vertical-align: baseline;color: var(--main-color) ;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">toFillPolygon&nbsp;() 和</span><span style="vertical-align: inherit;">toFillPolygons () 函数首先将所有子路径</span></span><span style="vertical-align: inherit;">转换</span><span style="vertical-align: inherit;">为多边形,然后使用倒带技术确保可以使用正确的填充规则填充重叠的子路径。</span></p><p style="margin-right: 0px;margin-bottom: 1.5em;margin-left: 0px;border: 0px;vertical-align: baseline;color: var(--main-color) ;"><span style="vertical-align: inherit;">请注意,倒带会在多边形中插入额外的线,因此填充多边形的轮廓与路径的轮廓不匹配。</span><span style="vertical-align: inherit;"></span><span style="vertical-align: inherit;"></span></p><p>Qt 提供了Painter Paths Example和Vector Deformation 示例:</p><p>Painter&nbsp;Paths Example展示了<span style="color: rgb(255, 0, 0);">如何使用 Painter Paths 来构建复杂的渲染形状,并让用户</span></p><p><span style="color: rgb(255, 0, 0);">尝试填充和描边。</span></p><p>Vector&nbsp;Deformation Example展示了<span style="color: rgb(255, 0, 0);">如何使用 QPainterPath 绘制文本。</span></p><div style="color: rgb(64, 66, 68); margin: 0px 0px 5px; padding: 0px; border: 1px solid var(--content-border-color) ; border-collapse: collapse; border-spacing: 0px; vertical-align: initial;"><thead style="margin: 0px; padding: 0px 0px 0px 20px; border: 0px;"></thead><tbody style="margin: 0px; padding: 0px; border: 0px;"><tr valign="top" style="margin: 0px; padding: 0px; border: 0px;"><td style="margin: 0px; padding: 5px 20px; border: 1px solid var(--content-border-color) ; line-height: 1.3; text-align: inherit;" width="280"><div style="text-align:left"><img doc360img-src='http://image109.360doc.com/DownloadImg/2023/03/0214/_3_.png' alt="" src="http://image109.360doc.com/DownloadImg/2023/03/0214/_3_.png" style="margin: 0px; padding: 0px; border-width: 0px; border-style: initial; vertical-align: baseline; max-width: initial; display: inline;"></div></td><td style="margin: 0px; padding: 5px 20px; border: 1px solid var(--content-border-color) ; line-height: 1.3; text-align: inherit; word-break: break-all;" width="264"><div style="text-align:left"><img doc360img-src='http://image109.360doc.com/DownloadImg/2023/03/0214/_4_.png' alt="" src="http://image109.360doc.com/DownloadImg/2023/03/0214/_4_.png" style="margin: 0px; padding: 0px; border-width: 0px; border-style: initial; vertical-align: baseline; max-width: initial; display: inline; width: 231px; height: 304px;" width="231" height="304"></div></td></tr></tbody></div> </td> </tr> </tbody> 

讯享网
小讯
上一篇 2025-06-15 13:35
下一篇 2025-06-15 17:43

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/150508.html