Класс перекрестия в Pyqtgraph

Я хотел бы определить класс 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)

Это правильный способ сделать это? Другими словами, правильно ли я делаю, что привязываю график к прицелу? Я хотел бы сделать наоборот, но я не уверен, как это сделать, и правильно ли это делать.

Кроме того, как мне получить значения данных (закомментированную часть) из самого графика?


person Fra    schedule 03.04.2014    source источник


Ответы (1)


Лучший способ сделать это — создать подкласс pg.GraphicsObject, включающий две InfiniteLines в качестве дочерних элементов. Ссылки: QtGui.QGraphicsItem, pg.GraphicsItem, см. также пример customGraphicsItem.

В классе должен быть метод setPos(), который устанавливает положение источника перекрестия. Затем вы можете добавить некоторый код уровня приложения, который отслеживает положение мыши и соответствующим образом обновляет перекрестие, как показано в примере с перекрестием. В качестве альтернативы вы можете сделать так, чтобы само перекрестие автоматически отслеживало положение мыши.

Что касается второго вопроса: вам, по крайней мере, нужно будет сообщить CrossHair, какие элементы PlotDataItem(s) или PlotCurveItem(s) он должен опрашивать, чтобы определить y-позицию, которая пересекает вертикальную линию.

person Luke    schedule 03.04.2014