Чтобы увидеть, в чем причина проблемы, мы можем поместить QBrush для рисования содержимого CurveItem и получить следующее:
def paint(self, painter, styles, widget=None):
painter.setBrush(QBrush(QColor("green")))
painter.drawPath(self.path)
Почему это происходит?
QPainterPath
соединяет конечную и начальную точки, если фигура не является закрытой, поэтому она генерирует фигуру с содержимым , и это приводит к тому, что при перемещении прямоугольника по линии она сигнализирует о том, что она пересекается .
Какое решение?
Вернитесь по тому же пути к начальной точке, соединяя, таким образом, новую последнюю строку с начальной без генерации содержимого .
В следующем коде есть решение:
class CurveItem(QGraphicsItem):
def __init__(self):
super().__init__()
self.path = self._setupPath()
def paint(self, painter, styles, widget):
painter.drawPath(self.path)
def boundingRect(self):
return self.path.boundingRect()
def shape(self):
return self.path
def _setupPath(self):
path = QPainterPath()
p1 = QPointF(0, 100)
p2 = QPointF(400, 100)
c = QPointF(200, 800)
path.moveTo(p1)
path.quadTo(c, p2)
# back
path.quadTo(c, p1)
return path