Как нарисовать перекрестие и положение мыши в pyqtgraph?

Я новичок в Python и pyqtgraph. Я работаю над просмотрщиком для различных видов сигналов. В настоящее время я застрял, когда хочу включить перекрестие и текстовую метку с положением мыши. Я работаю с GridLayout, потому что позже график объединяется с несколькими другими элементами.

Я попытался адаптировать пример pyqtgraph для взаимодействия перекрестия с мышью, но, помимо многих других вещей в pyqtgraph, я не понимаю значения vb = signalgraph.vb непосредственно перед mousemoved(), и скрипт вызывает NameError

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_()

Большое спасибо С уважением Михаил


person Michael    schedule 22.07.2013    source источник


Ответы (1)


"vb" является атрибутом класса PlotItem. Так как signalgraph является PlotWidget, вы можете не ожидать, что он будет иметь те же атрибуты (хотя он содержит некоторые методы из своего внутреннего PlotItem). Итак, код, который вам нужен:

vb = signalgraph.plotItem.vb

Если вы не понимаете разницы между PlotWidget и PlotItem, почитайте о классах QGraphicsView и QGraphicsItem (оба в документации Qt). PlotWidget — это немного больше, чем QGraphicsView с PlotItem, отображаемым внутри.

person Luke    schedule 22.07.2013
comment
Спасибо, Люк, все работает так, как ты говоришь. Мне нужно многому научиться! - person Michael; 24.07.2013