如何在pyqtgraph中移动矩形

How to move rect in pyqtgraph

我尝试有一个随鼠标指针移动的矩形。但是,我似乎在调用 paint 方法时遇到了问题。它要么不绘制,要么不创建工件。我得到的唯一干净的图片是强制重绘(缩放图表)。

这是我的mwe

import sys

from PyQt5 import QtWidgets, QtCore, QtGui
import pyqtgraph as pg


class RectItem(pg.GraphicsObject):
    def __init__(self):
        super().__init__()
        self.rect = QtCore.QRectF(0, 0, 1, 1)
        self.picture = QtGui.QPicture()
        self.generate_picture()

    def generate_picture(self):
        painter = QtGui.QPainter(self.picture)
        painter.setPen(pg.mkPen('r'))
        painter.drawRect(self.rect)
        painter.end()

    def paint(self, painter, option, widget=None):
        print('paint')
        painter.drawPicture(0, 0, self.picture)

    def boundingRect(self):
        return QtCore.QRectF(self.picture.boundingRect())

    def move(self, x, y):
        print(f'{x} {y}')
        self.rect.moveCenter(QtCore.QPointF(x, y))
        self.generate_picture()


class PlotWidget(pg.PlotWidget):
    mouse_moved = QtCore.pyqtSignal(float, float)

    def __init__(self):
        super().__init__()
        self.sig = pg.SignalProxy(
            self.scene().sigMouseMoved,
            rateLimit=60,
            slot=self._mouse_moved,
        )

    def _mouse_moved(self, event):
        pos, = event

        mousePoint = self.plotItem.vb.mapSceneToView(pos)
        x = mousePoint.x()
        y = mousePoint.y()

        self.mouse_moved.emit(x, y)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)

    main = PlotWidget()
    rect = RectItem()
    main.mouse_moved.connect(rect.move)
    main.addItem(rect)

    main.show()

    sys.exit(app.exec_())

仅重绘内部 QPicture 的内容不会以任何方式影响图形项目,您必须调用 update() 才能正确刷新项目。还要考虑到,由于您实际上是在更改项目的边界矩形,因此您还必须在 更改几何之前调用 prepareGeometryChange() ,否则您会看到由于先前矩形位置未正确清除。

    def move(self, x, y):
        self.rect.moveCenter(QtCore.QPointF(x, y))
        <b>self.prepareGeometryChange()
        self.generate_picture()
        self.update()</b>

此外,如果您只需要用鼠标移动一个矩形,请考虑使用更简单的 QGraphicsRectItem,它不需要任何绘画实现。