How to draw crosshair and plot mouse position in pyqtgraph?
我是Python和pyqtgraph的新手。我正在为各种信号的查看器工作。目前,当我想在鼠标位置添加十字准线和文本标签时,我陷入了困境。我正在使用GridLayout,因为以后图形将与其他几个元素组合在一起。
我试图改写pyqtgraph示例十字线/鼠标交互,但是除了pyqtgraph中的许多其他事情之外,我不了解在mousemoved()之前vb = signalgraph.vb的含义,并且脚本引发了NameError
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | from pyqtgraph.Qt import QtGui, QtCore import numpy as np import pyqtgraph as pg #QtGui.QApplication.setGraphicsSystem('raster') app = QtGui.QApplication([]) mainwindow = QtGui.QMainWindow() mainwindow.setWindowTitle('pyqtgraph example: PlotWidget') mainwindow.resize(1000,800) cw = QtGui.QWidget() mainwindow.setCentralWidget(cw) gridlayout = QtGui.QGridLayout() cw.setLayout(gridlayout) # define plot windows signalgraph = pg.PlotWidget(name='Signalgraph') # set position and size of plot windows gridlayout.addWidget(signalgraph,0,0) mainwindow.show() # sample data x = [0,1,2,3,4,5,6,7,8,9,10] y = [0,0,0,8,8,8,9,9,9,0,0] # plot 1 curve = pg.PlotCurveItem(x,y[:-1],pen='w',stepMode=True) signalgraph.addItem(curve) #cross hair in signalgraph vLine = pg.InfiniteLine(angle=90, movable=False) hLine = pg.InfiniteLine(angle=0, movable=False) signalgraph.addItem(vLine, ignoreBounds=True) signalgraph.addItem(hLine, ignoreBounds=True) # Here I am not sure what to do ... vb = signalgraph.vb ##vb = pg.ViewBox() def mouseMoved(evt): pos = evt[0] if signalgraph.sceneBoundingRect().contains(pos): mousePoint = vb.mapSceneToView(pos) index = int(mousePoint.x()) if index > 0 and index < len(x): label.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()) proxy = pg.SignalProxy(signalgraph.scene().sigMouseMoved, rateLimit=60, slot=mouseMoved) signalgraph.scene().sigMouseMoved.connect(mouseMoved) # Start Qt event loop unless running in interactive mode or using pyside. if __name__ == '__main__': import sys if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): QtGui.QApplication.instance().exec_() |
非常感谢
问候
迈克尔
" vb"是PlotItem类的属性。由于
1 | vb = signalgraph.plotItem.vb |
如果您对PlotWidget和PlotItem之间的区别感到困惑,请继续阅读QGraphicsView和QGraphicsItem类(均在Qt文档中)。 PlotWidget只是一个QGraphicsView,内部显示了一个PlotItem。