为了账号安全,请及时绑定邮箱和手机立即绑定

QRubberBand.geometry().intersects(???

QRubberBand.geometry().intersects(???

汪汪一只猫 2022-01-18 15:48:21
我发现很少有演示代码intersects,但主要是按钮。像这样的东西:for child in self.findChildren(QPushButton):    if rect.intersects(child.geometry( )):        selected.append(child)但是,如何在 GraphicsScene 中找到与“Marquee”选择(QRubberBand)相交的图像?我尝试用 QPixmap、QGraphicsScene、QGraphicsPixmapItem 替换 findChildren(QPushButton),它总是给我返回空列表。
查看完整描述

1 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

如果您正在使用具有 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,则逻辑与此类似,因为您必须使用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_())


查看完整回答
反对 回复 2022-01-18
  • 1 回答
  • 0 关注
  • 148 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信