QPainterPath形状,线条笔划向内投影

2024-04-19 11:19:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个由一些曲线组成的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_())

enter image description here

我试图将未填充的区域视为在路径的轮廓内(因此它也会被填充)。将最后一条曲线分离为另一条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))

enter image description here

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

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

enter image description here

这就是我所能做到的。明确地说,这就是我想要作为一个QPainterPath对象得到的

enter image description here

我知道我可以在绘制设备上用QPainter.fillPath单独填充交叉点(如此图像所示),但这不是我想要的。我需要一个QPainterPath,其中包括作为路径一部分的未填充区域。(将其绘制在pixmap上只是为了验证其是否符合要求)。我确信这一定是可能的,我不确定使用什么样的QPainterPath方法组合来获得它


Tags: pathfromimport区域sysqtpyqt5轮廓
1条回答
网友
1楼 · 发布于 2024-04-19 11:19:41

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

direction of path

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

    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(179, 48)
    path.cubicTo(160, 6, 75, 18, 82, 80)

correct path

相关问题 更多 >