首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法检查QRect在pyqt5中的边界内是否包含QGraphicspathitem?

有没有办法检查QRect在pyqt5中的边界内是否包含QGraphicspathitem?
EN

Stack Overflow用户
提问于 2019-09-07 13:09:29
回答 1查看 258关注 0票数 0

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

EN

回答 1

Stack Overflow用户

发布于 2019-09-08 07:55:49

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

代码语言:javascript
复制
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_())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57830856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档