有什么方法可以检查QRect是否在pyqt5的边界内包含QGraphicspathitem?

时间:2019-09-07 05:09:28

标签: pyqt5

我在场景中有一个QGraphicspathitem。如果单击场景,我将得到该网格的矩形。现在,我需要检查QRect是否在其边界内包含QGraphicspathitem

1 个答案:

答案 0 :(得分:0)

检查QPainterPath P是否在矩形R(无旋转)内,如果R中包含最小的矩形,则必须使用boundingRect()。要知道另一个矩形(R2)中是否包含一个矩形(R1),只要知道两个矩形的并集等于R2就足够了。考虑到解决方案是:

import math
import random
from PyQt5 import QtCore, QtGui, QtWidgets


class GraphicsView(QtWidgets.QGraphicsView):
    def __init__(self, parent=None):
        super(GraphicsView, self).__init__(parent)

        self._scene = QtWidgets.QGraphicsScene(QtCore.QRectF(0, 0, 400, 400), self)
        self.setScene(self._scene)

        self._rect = QtCore.QRectF(40, 40, 100, 100)

        rect_item = self._scene.addRect(self._rect)
        rect_item.setPen(QtGui.QPen(QtGui.QColor("green")))

        # create QGraphicsPathItems

        radius, number_of_sides = 40, 5

        for i in range(4):
            pos = QtCore.QPointF(*random.sample(range(0, 200), 2))
            center = QtCore.QPointF(*random.sample(range(0, 200), 2))
            poly = QtGui.QPolygonF()
            for j in range(number_of_sides + 1):
                angle = 2 * math.pi * j / number_of_sides
                poly << (
                    center + radius * QtCore.QPointF(math.cos(angle), math.sin(angle))
                )
            path = QtGui.QPainterPath()
            path.addPolygon(poly)
            path_item = QtWidgets.QGraphicsPathItem(path)
            path_item.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable)
            path_item.setPos(pos)
            self._scene.addItem(path_item)

        timer = QtCore.QTimer(self, timeout=self.on_timeout, interval=60)
        timer.start()

    def on_timeout(self):
        for item in self._scene.items():
            if isinstance(item, QtWidgets.QGraphicsPathItem):
                color = (
                    QtGui.QColor("blue")
                    if self.verify_if_qgraphicspathitem_inside_qrectf(item, self._rect)
                    else QtGui.QColor("red")
                )
                item.setBrush(QtGui.QBrush(color))

    def verify_if_qgraphicspathitem_inside_qrectf(self, item, rect):
        """
        Check if a QGraphicsPathItem(item) is inside a rectangle(rect)
        """
        path = item.mapToScene(item.path())
        return rect == path.boundingRect().united(rect)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = GraphicsView()
    w.show()
    w.resize(640, 480)
    sys.exit(app.exec_())