【发布时间】: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_())
【问题讨论】: