我在场景中有一个QGraphicspathitem。如果单击场景,我将得到该网格的矩形。现在,我需要检查QRect是否在其边界内包含QGraphicspathitem
答案 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_())