Skip to content Skip to sidebar Skip to footer

QRubberBand.geometry().intersects(???) How To Find Intersecting Images In QGraphicsScene?

I found few codes which demonstrates intersects, but it was mainly buttons. Something like this: for child in self.findChildren(QPushButton): if rect.intersects(child.geometry(

Solution 1:

If you are using the QRubberBand that has the QGraphicsView you have to use the rubberBandChanged signal and next to the items method you get the items that are below the QRubberBand.

from PyQt5 import QtCore, QtGui, QtWidgets
import random


def create_pixmap():
    pixmap = QtGui.QPixmap(100, 100)
    pixmap.fill(QtGui.QColor(*random.sample(range(255), 3)))
    return pixmap


class GraphicsView(QtWidgets.QGraphicsView):
    def __init__(self, parent=None):
        super(GraphicsView, self).__init__(parent)
        self.setScene(QtWidgets.QGraphicsScene(self))
        self.setDragMode(QtWidgets.QGraphicsView.RubberBandDrag)
        self.rubberBandChanged.connect(self.on_rubberBandChanged)

        for _ in range(5):
            item = QtWidgets.QGraphicsPixmapItem(create_pixmap())
            item.setPos(*random.sample(range(500), 2))
            self.scene().addItem(item)

    @QtCore.pyqtSlot("QRect", "QPointF", "QPointF")
    def on_rubberBandChanged(
        self, rubberBandRect, fromScenePoint, toScenePoint
    ):
        r = QtCore.QRectF(fromScenePoint, toScenePoint)
        selected = self.items(rubberBandRect)
        print(selected)


if __name__ == "__main__":
    import sys

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

If you are using another QRubberBand the logic is similar to that since you must use the items() method of QGraphicsView

from PyQt5 import QtCore, QtGui, QtWidgets
import random


def create_pixmap():
    pixmap = QtGui.QPixmap(100, 100)
    pixmap.fill(QtGui.QColor(*random.sample(range(255), 3)))
    return pixmap


class GraphicsView(QtWidgets.QGraphicsView):
    def __init__(self, parent=None):
        super(GraphicsView, self).__init__(parent)
        self.setScene(QtWidgets.QGraphicsScene(self))
        self._rubberBand = QtWidgets.QRubberBand(
            QtWidgets.QRubberBand.Rectangle, self.viewport()
        )
        self._rubberBand.hide()
        self._origin = QtCore.QPoint()

        for _ in range(5):
            item = QtWidgets.QGraphicsPixmapItem(create_pixmap())
            item.setPos(*random.sample(range(500), 2))
            self.scene().addItem(item)

    def mousePressEvent(self, event):
        self._origin = event.pos()
        self._rubberBand.setGeometry(QtCore.QRect(self._origin, QtCore.QSize()))
        self._rubberBand.show()
        super(GraphicsView, self).mousePressEvent(event)

    def mouseMoveEvent(self, event):
        self._rubberBand.setGeometry(
            QtCore.QRect(self._origin, event.pos()).normalized()
        )

    def mouseReleaseEvent(self, event):
        self._rubberBand.setGeometry(
            QtCore.QRect(self._origin, event.pos()).normalized()
        )
        selected = self.items(self._rubberBand.geometry())
        print(selected)
        self._rubberBand.hide()


if __name__ == "__main__":
    import sys

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

Post a Comment for "QRubberBand.geometry().intersects(???) How To Find Intersecting Images In QGraphicsScene?"