我想定义一个名为Crosshair的类,它可以附加到pyqtgraph中的一个图上。我在示例中找到了以下代码段:
#cross hair
vLine = pg.InfiniteLine(angle=90, movable=False)
hLine = pg.InfiniteLine(angle=0, movable=False)
p1.addItem(vLine, ignoreBounds=True)
p1.addItem(hLine, ignoreBounds=True)
vb = p1.vb
def mouseMoved(evt):
pos = evt[0] ## using signal proxy turns original arguments into a tuple
if p1.sceneBoundingRect().contains(pos):
mousePoint = vb.mapSceneToView(pos)
index = int(mousePoint.x())
if index > 0 and index < len(data1):
label.setText("<span style='font-size: 12pt'>x=%0.1f, <span style='color: red'>y1=%0.1f</span>, <span style='color: green'>y2=%0.1f</span>" % (mousePoint.x(), data1[index], data2[index]))
vLine.setPos(mousePoint.x())
hLine.setPos(mousePoint.y())
proxy = pg.SignalProxy(p1.scene().sigMouseMoved, rateLimit=60, slot=mouseMoved)
我开始将它转换为类,如下所示:
class CrossHair():
def __init__(self, p1):
self.vLine = pg.InfiniteLine(angle=90, movable=False)
self.hLine = pg.InfiniteLine(angle=0, movable=False)
self.p1 = p1
self.vb = self.p1.vb
p1.addItem(self.vLine, ignoreBounds=True)
p1.addItem(self.hLine, ignoreBounds=True)
self.proxy = pg.SignalProxy(self.p1.scene().sigMouseMoved, rateLimit=60, slot=self.mouseMoved)
def mouseMoved(self, evt):
pos = evt[0] ## using signal proxy turns original arguments into a tuple
if self.p1.sceneBoundingRect().contains(pos):
mousePoint = self.vb.mapSceneToView(pos)
index = int(mousePoint.x())
# if index > 0 and index < len(data1):
# label.setText("<span style='font-size: 12pt'>x=%0.1f, <span style='color: red'>y1=%0.1f</span>, <span style='color: green'>y2=%0.1f</span>" % (mousePoint.x(), data1[index], data2[index]))
self.vLine.setPos(mousePoint.x())
self.hLine.setPos(mousePoint.y())
ch = CrossHair(p1)
这是正确的方法吗? 换句话说,我是否正确将情节附加到十字准线上?我本来希望做相反的事情,但我不知道该怎么做,也不是这样做。
另外,如何从绘图本身检索数据值(注释部分)?
答案 0 :(得分:1)
更好的方法是创建一个pg.GraphicsObject的子类,其中包含两个InfiniteLines作为子节点。参考文献:QtGui.QGraphicsItem,pg.GraphicsItem,另请参阅customGraphicsItem示例。
该类应该有一个setPos()方法,用于设置十字准线原点的位置。然后,您可以添加一些跟踪鼠标位置的应用程序级代码并相应地更新十字准线,如十字准线示例所示。或者,您可以让十字准线自动跟踪鼠标位置。
关于第二个问题:你至少需要告诉CrossHair它应该询问哪个PlotDataItem(s)或PlotCurveItem(s)以确定与垂直线相交的y位置。