如何将图像添加到 QGraphicsScene 以便可以在其上定位矩形项目?

问题描述

我有一个 python 代码,可以在 QGraphicsScene 上添加多个矩形。

from PyQt5 import QtCore,QtGui,QtWidgets

class GraphicsScene(QtWidgets.QGraphicsScene):
    def __init__(self,parent=None):
        super(GraphicsScene,self).__init__(QtCore.QRectF(-500,-500,1000,1000),parent)
        self._start = QtCore.QPointF()
        self._current_rect_item = None

    def mousepressEvent(self,event):
        if self.itemAt(event.scenePos(),QtGui.QTransform()) is None:
            self._current_rect_item = QtWidgets.QGraphicsRectItem()
            self._current_rect_item.setBrush(QtCore.Qt.red)
            self._current_rect_item.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable,True)
            self.addItem(self._current_rect_item)
            self._start = event.scenePos()
            r = QtCore.QRectF(self._start,self._start)
            self._current_rect_item.setRect(r)
        super(GraphicsScene,self).mousepressEvent(event)

    def mouseMoveEvent(self,event):
        if self._current_rect_item is not None:
            r = QtCore.QRectF(self._start,event.scenePos()).normalized()
            self._current_rect_item.setRect(r)
        super(GraphicsScene,self).mouseMoveEvent(event)

    def mouseReleaseEvent(self,event):
        self._current_rect_item = None
        super(GraphicsScene,self).mouseReleaseEvent(event)


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self,parent=None):
        super(MainWindow,self).__init__(parent)
        scene =GraphicsScene(self)
        view = QtWidgets.QGraphicsView(scene)
        self.setCentralWidget(view)


if __name__ == '__main__':
    import sys

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

我的问题是如何在 QGraphicsScene(的背景)中添加图像,以便矩形覆盖在该图像上?

解决方法

有几个选项:

  • setBackgroundBrush():

    brush = QtGui.QBrush(QtGui.QPixmap("/path/of/image.png"))
    scene.setBackgroundBrush(brush)
    
  • 覆盖 drawBackground():

    class GraphicsScene(QtWidgets.QGraphicsScene):
        def __init__(self,parent=None):
            super(GraphicsScene,self).__init__(QtCore.QRectF(-500,-500,1000,1000),parent)
            self._start = QtCore.QPointF()
            self._current_rect_item = None
    
        def drawBackground(self,painter,rect):
            pixmap = QtGui.QPixmap("/path/of/image.png")
            painter.drawPixmap(QtCore.QPointF(0,0),pixmap)