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

标签 python pyqt

我发现很少有代码可以演示相交,但主要是按钮。像这样的事情:

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

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

最佳答案

如果您使用具有 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_())

如果您使用另一个 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_())

关于python - QRubberBand.geometry().intersects(???) 如何在QGraphicsScene中找到相交的图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55790564/

相关文章:

python - 你如何在 python 中执行 pyqt .ui 代码?

python - 如果以非贪婪方式使用,python 正则表达式中量词 {m,n} 中的第二个限制有什么用?

python - 如何使用networkx图过滤具有特定属性的节点并保留路径

QtQuick 2.0 与 QGraphicsView (QPainter)

python - 在 QCompleter 激活调用时查找 QStandardItemModel 的索引

c++ - 滚动时的滚动条事件?

python - 关闭 PyQt 对话框而不关闭主程序

python - Bool对象不支持item赋值

python - 在 optparse 帮助输出中列出选项

python - 从数据框中的每个组中删除特定的一组行