QRubberBand.geometry (). Intersects (???) Как найти пересекающиеся изображения в QGraphicsScene? - PullRequest
1 голос
/ 22 апреля 2019

Я нашел несколько кодов, которые показывают intersects, но это были в основном кнопки. Как то так:

for child in self.findChildren(QPushButton):
    if rect.intersects(child.geometry( )):
        selected.append(child)

Но как вы находите изображения, пересекающиеся в вашей GraphicsScene с выделением «Marquee» (QRubberBand)? Я попытался заменить findChildren (QPushButton) на QPixmap, QGraphicsScene, QGraphicsPixmapItem, который всегда возвращал мне пустой список.

1 Ответ

1 голос
/ 22 апреля 2019

Если вы используете QRubberBand с QGraphicsView, вы должны использовать сигнал rubberBandChanged, и рядом с методом элементов вы получите элементы, которые находятся ниже 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_())

Если вы используете другойQRubberBand логика похожа на эту, так как вы должны использовать метод items () 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_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...