精确检测两个图形项之间的碰撞

时间:2018-04-29 13:06:40

标签: python pyqt pyqt4 pyqt5 qgraphicsitem

我有两个图形项RectItemCurveItem。我需要准确地检测这两个项目之间的碰撞。我为展位项实施了shape()方法。我从场景self.collidingItems(self.rect_item, mode=Qt.IntersectsItemShape移动其中一个项目时验证是否检测到碰撞。

我通过在场景中移动项目来碰撞项目,但仅在CurveItem的顶部检测到碰撞。我不明白我犯了什么错误。

enter image description here

代码:

class RectItem(QGraphicsRectItem):
    def __init__(self, x, y, w, h):
        super().__init__(x, y, w, h)
        self.setFlag(QGraphicsItem.ItemIsMovable)
        self.setPen(QPen(Qt.cyan))

    def shape(self):
        path = QPainterPath()
        path.addRect(self.boundingRect())
        return path


class CurveItem(QGraphicsItem):
    def __init__(self):
        super().__init__()
        self.path = self._setupPath()

    def paint(self, painter, styles, widget=None):
        painter.drawPath(self.path)

    def boundingRect(self):
        return QRectF()

    def shape(self):
        return self.path

    def _setupPath(self):
        path = QPainterPath()
        path.moveTo(0, 0)
        path.cubicTo(99, 0, 50, 50, 99, 99)
        path.cubicTo(0, 99, 50, 50, 0, 0)
        return path


class Scene(QGraphicsScene):
    def __init__(self):
        super().__init__()
        self.curve_item = CurveItem()
        self.rect_item = RectItem(-50, -50, 25, 25)

        self.addItem(self.curve_item)
        self.addItem(self.rect_item)

    def mouseMoveEvent(self, e):
        print(self.collidingItems(self.rect_item, mode=Qt.IntersectsItemShape))
        super().mouseMoveEvent(e)

1 个答案:

答案 0 :(得分:1)

虽然您不会使用boundingRect()来检测碰撞,但您必须返回覆盖QRect的最小尺寸shape,为此我们可以使用{{1} } boundingRect()的方法,除了没有必要覆盖形状QPainterPath

QGraphicsRectItem