如何在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,它不需要任何绘画实现。
我尝试有一个随鼠标指针移动的矩形。但是,我似乎在调用 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,它不需要任何绘画实现。