2014-04-03 6 views
0

pyqtgraph의 플롯에 연결할 수있는 Crosshair라는 클래스를 정의하고 싶습니다.Pyqtgraph의 십자선 클래스

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) 

이 그것을 할 올바른 방법입니다

#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) 

나는 다음과 같은 클래스로 변환 시작 : 나는 예제에서 다음 코드를 발견? 즉, 십자형에 음모를 첨부하는 것이 옳은 일입니까? 나는 그 반대를하고 싶었지 만, 어떻게해야하는지 잘 모르겠다.

또한 어떻게 플롯 자체에서 데이터 값 (주석 처리 된 부분)을 검색합니까?

답변

1

이렇게하는 더 좋은 방법은 두 개의 InfiniteLines을 자식으로 포함하는 pg.GraphicsObject의 하위 클래스를 만드는 것입니다. 참조 : QtGui.QGraphicsItem, pg.GraphicsItem, 또한 customGraphicsItem 예제를 참조하십시오.

클래스에는 십자선 원점의 위치를 ​​설정하는 setPos() 메서드가 있어야합니다. 그런 다음 십자형 예와 같이 마우스 위치를 추적하고 그에 따라 십자선을 업데이트하는 응용 프로그램 수준 코드를 추가 할 수 있습니다. 또는 십자선 자체가 마우스 위치를 자동으로 추적하도록 할 수도 있습니다.

두 번째 질문에 대해 : 적어도 CrossHair에게 수직선과 교차하는 y 위치를 결정하기 위해 어떤 PlotDataItem (s) 또는 PlotCurveItem (s)을 조사해야하는지 알려줄 필요가 있습니다.

+0

감사! 예제 코드 스 니펫을 게시 할 수 있습니까? – Fra