【问题标题】:How to move rect in pyqtgraph如何在pyqtgraph中移动矩形
【发布时间】:2021-03-21 16:56:48
【问题描述】:

我尝试创建一个随鼠标指针移动的矩形。但是,我似乎在调用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_())

【问题讨论】:

    标签: python pyqt5 pyqtgraph


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-05-17
      • 2012-01-02
      • 2021-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多