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>
我有一个由几条曲线组成的 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>