我有一个由一些曲线组成的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)
将返回未填充区域的QPainterPath,但其周围有一个轮廓。将path2
和交叉点添加到path
将填充整个区域,但它现在有额外的轮廓
intersection = path.intersected(path2)
path.addPath(path2)
path.addPath(intersection)
...
qp.drawPath(path)
这就是我所能做到的。明确地说,这就是我想要作为一个QPainterPath对象得到的:
我知道我可以在绘制设备上用QPainter.fillPath
单独填充交叉点(如此图像所示),但这不是我想要的。我需要一个QPainterPath,其中包括作为路径一部分的未填充区域。(将其绘制在pixmap上只是为了验证其是否符合要求)。我确信这一定是可能的,我不确定使用什么样的QPainterPath方法组合来获得它
这是因为您正在移动到曲线的另一侧,这实际上创建了一条新的叠加路径,该路径被视为在前一条路径之外。在这种情况下,即使使用^{} 到
QtCore.Qt.WindingFill
也不会给出适当的结果解决方案是反转曲线,并移动到上一条路径的最近的位置:
相关问题 更多 >
编程相关推荐