как сделать трекер мыши с перекрестием на PlotWidget (), продвигаемый в designer-qt5 - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь сделать перекрестие на моих интерактивных графиках pyqtgraph, которые встроены в графический интерфейс PyQt5 благодаря designer-qt5.Я нашел рабочий код в pyqtgraph "Примеры".Упрощенный РАБОЧИЙ пример приведен ниже.Теперь я хочу того же, но проблема, похоже, заключается в том, что я добавил QGraphicsView () в pg.PlotWidget в конструкторе вместо pg.GraphicsWindow ()?Код не работает для меня, потому что мой p1 является "pyqtgraph.widgets.PlotWidget.PlotWidget object", в то время как в примере p1 это
"pyqtgraph.graphicsItems.PlotItem.PlotItem.PlotItem object".

что я должен сделать, чтобы этот пример работал на меня?

import numpy as np
import pyqtgraph as pg
from pyqtgraph.Qt import QtGui, QtCore
from pyqtgraph.Point import Point

pg.setConfigOption('background', '#ffffff')
pg.setConfigOption('foreground', 'k')
pg.setConfigOptions(antialias=True)  

app = QtGui.QApplication([])
win = pg.GraphicsWindow()
win.setWindowTitle('pyqtgraph example: crosshair')
label = pg.LabelItem(justify='right')
win.addItem(label)
p1 = win.addPlot(row=1, col=0)       

p1.setAutoVisible(y=True)

#create numpy arrays
#make the numbers large to show that the xrange shows data from 10000 to all the way 0
data1 = 10000 + 15000 * pg.gaussianFilter(np.random.random(size=10000), 10) + 3000 * np.random.random(size=10000)

p1.plot(data1, pen="r")

#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 

print(p1)
print(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: green'>y2=%0.1f</span>" % (mousePoint.x(), data1[index]))
        vLine.setPos(mousePoint.x())
        hLine.setPos(mousePoint.y())

proxy = pg.SignalProxy(p1.scene().sigMouseMoved, rateLimit=60, slot=mouseMoved)
#p1.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_()

1 Ответ

0 голосов
/ 09 мая 2019

Мне очень жаль шум! Я сам исправляю!

Важная часть была:

plot_wg.proxy = прокси

Очень просто ...

Ниже приведена функция, которая должна работать для любого PlotWidget:

def cross_hair(self, plot_wg, log=False ):
    global fit 
    ################### TETS cross hair ############3    

    vLine = pg.InfiniteLine(angle=90, movable=False)#, pos=0)
    hLine = pg.InfiniteLine(angle=0,  movable=False)#, pos=2450000)
    plot_wg.addItem(vLine, ignoreBounds=True)
    plot_wg.addItem(hLine, ignoreBounds=True)


    vb = plot_wg.getViewBox()


    label = pg.TextItem()
    plot_wg.addItem(label) 

    def mouseMoved(evt):
        pos = evt[0]  ## using signal proxy turns original arguments into a tuple
        if plot_wg.sceneBoundingRect().contains(pos):


            mousePoint = vb.mapSceneToView(pos)

            if log == True:
                label.setText("x=%0.3f,  y1=%0.3f"%(10**mousePoint.x(), mousePoint.y()))
            else:
                label.setText("x=%0.3f,  y1=%0.3f"%(mousePoint.x(), mousePoint.y()))

            vLine.setPos(mousePoint.x())
            hLine.setPos(mousePoint.y())
            #print(mousePoint.x(),mousePoint.y())

    plot_wg.getViewBox().setAutoVisible(y=True)

    proxy = pg.SignalProxy(plot_wg.scene().sigMouseMoved, rateLimit=60, slot=mouseMoved)    
    plot_wg.proxy = proxy




 proxy = pg.SignalProxy(plot_wg.scene().sigMouseMoved, rateLimit=60, slot=mouseMoved)

 plot_wg.proxy = proxy

 ################### TETS cross hair ############3 
...