Отображать координаты в pyqtgraph?
Я пытаюсь разработать графический интерфейс, который позволяет отслеживать координаты мыши в PlotWidget и отображать метку в другом месте главного окна. Я несколько раз пытался эмулировать пример перекрестия в документации pyqtgraph, но не смог заставить его согласиться сделать это. Частично сложность заключается в том, что я не могу понять, как получить доступ к отслеживанию мыши, которое я могу включить в QtDesigner.
Я попытался использовать:
proxy = pg.SignalProxy(Plotted.scene().sigMouseMoved, rateLimit=60, slot=mouseMoved)
Plotted.scene().sigMouseMoved.connect(mouseMoved)
Однако я не совсем понимаю, что позволяет "обновлять" это в реальном времени, и на каком уровне я должен иметь это утверждение. Если
def mouseMoved(evt):
pos = evt[0]
if Plotted.sceneBoundingRect().contains(pos):
mousePoint = vb.mapSceneToView(pos)
index = int(mousePoint.x())
if index > 0 and index < len(x):
mousecoordinatesdisplay.setText("<span style='font-size: 12pt'>x=%0.1f, <span style='color: red'>y1=%0.1f</span>" % (mousePoint.x(), y[index], data2[index]))
vLine.setPos(mousePoint.x())
hLine.setPos(mousePoint.y())
часть кода находиться в классе Ui_MainWindow или вне его?
2 ответа
Я смог заставить работать обновления, выполнив следующие действия:
В функции настройки:
Plotted = self.plot
vLine = pg.InfiniteLine(angle=90, movable=False)
hLine = pg.InfiniteLine(angle=0, movable=False)
Plotted.addItem(vLine, ignoreBounds=True)
Plotted.addItem(hLine, ignoreBounds=True)
Plotted.setMouseTracking(True)
Plotted.scene().sigMouseMoved.connect(self.mouseMoved)
def mouseMoved(self,evt):
pos = evt
if self.plot.sceneBoundingRect().contains(pos):
mousePoint = self.plot.plotItem.vb.mapSceneToView(pos)
self.mousecoordinatesdisplay.setText("<span style='font-size: 15pt'>X=%0.1f, <span style='color: black'>Y=%0.1f</span>" % (mousePoint.x(),mousePoint.y()))
self.plot.plotItem.vLine.setPos(mousePoint.x())
self.plot.plotItem.hLine.setPos(mousePoint.y()
Где.mousecoordinatedisplay это ярлык. Мне потребовалось целую вечность, чтобы понять, как это сделать с использованием графического интерфейса от дизайнера. Похоже, что между pyqt4 и pyqt5 произошло изменение по сравнению с Qpointf, где новый Qpointf не допускает индексацию. Просто передавая evt
переменная, это можно отобразить без вызова evt[0]
,
Изменена функция MouseMoved, чтобы ограничить точность отображаемых чисел для моего приложения:
def MouseMoved(self, evt):
pos = evt
if self.graphWidget.sceneBoundingRect().contains(pos):
mousePoint = self.graphWidget.plotItem.vb.mapSceneToView(pos)
x = float("{0:.3f}".format(mousePoint.x()))
y = float("{0:.3f}".format(mousePoint.y()))
self.xylabel.setText(f"Cursor Position: {x, y})