QRubberBand.geometry()。intersects(???)如何在QGraphicsScene中找到相交的图像?

时间:2019-04-22 07:13:14

标签: python pyqt

我发现很少能显示intersects的代码,但主要是按钮。像这样:

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

但是,如何找到与“选取框”(QRubberBand)选择的GraphicsScene相交的图像?我尝试用QPixmap,QGraphicsScene,QGraphicsPixmapItem替换findChildren(QPushButton),它总是给我空列表。

1 个答案:

答案 0 :(得分:1)

如果您使用的是具有QGraphicsView的QRubberBand,则必须使用rubberBandChanged信号,并且在items方法旁边,您将获得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_())

如果您使用的是另一个QRubberB,其逻辑与之类似,因为必须使用QGraphicsView的items()方法

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_())