QPainterPath 形状,线条笔划向内突出

QPainterPath shape with line strokes projecting inside

我有一个由几条曲线组成的 QPainterPath。

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *

if __name__ == '__main__':
    app = QApplication(sys.argv)
    
    path = QPainterPath(QPoint(80, 70))
    path.quadTo(-50, 128, 90, 113)
    path.lineTo(193, 83)
    path.cubicTo(275, 43, 292, 5, 176, 41)
    path.moveTo(82, 80)
    path.cubicTo(75, 18, 160, 6, 179, 48)
    
    pix = QPixmap(280, 150)
    pix.fill(Qt.transparent)
    qp = QPainter(pix)
    qp.setRenderHint(QPainter.Antialiasing)
    qp.setPen(QPen(Qt.black, 4, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
    qp.setBrush(Qt.green)
    
    qp.drawPath(path)
    
    label = QLabel(pixmap=pix, visible=True)
    sys.exit(app.exec_())

我试图让未填充的区域被视为在路径轮廓内(因此它也被填充)。将最后一条曲线分离到另一个 QPainterPath 并将它们合并填充该区域但删除向下延伸的部分轮廓。

path = QPainterPath(QPoint(80, 70))
path.quadTo(-50, 128, 90, 113)
path.lineTo(193, 83)
path.cubicTo(275, 43, 292, 5, 176, 41)

path2 = QPainterPath()
path2.moveTo(82, 80)
path2.cubicTo(75, 18, 160, 6, 179, 48)

...
qp.drawPath(path.united(path2))

path.intersected(path2) 将 return 未填充区域的 QPainterPath,但周围有轮廓。将 path2 和交叉点添加到 path 将填满整个区域,但它现在有额外的轮廓。

intersection = path.intersected(path2)
path.addPath(path2)
path.addPath(intersection)
...
qp.drawPath(path)

我已经很接近了。明确地说,这就是我想要 作为一个 QPainterPath 对象 :

我知道我可以在绘图设备上用 QPainter.fillPath 单独填充交叉点(就像这张图片所做的那样),但这不是我想要的。我需要一个 QPainterPath,其中包括作为路径一部分的未填充区域。 (在像素图上绘制它只是为了验证它是否按预期运行)。我确定它一定是可能的,我不确定使用什么 QPainterPath 方法组合来获得它。

原因是您正在移动到曲线的另一侧,这实际上创建了一条新的叠加路径,该路径被认为是在前一条路径之外。在这种情况下,即使使用 setFillRule()QtCore.Qt.WindingFill 也不会给您适当的结果。

解决方法是将曲线反转,移动到上一条路径最近的位置:

    path = QPainterPath(QPoint(80, 70))
    path.quadTo(-50, 128, 90, 113)
    path.lineTo(193, 83)
    path.cubicTo(275, 43, 292, 5, 176, 41)
    <b>path.moveTo(179, 48)
    path.cubicTo(160, 6, 75, 18, 82, 80)</b>