我是一个新的pyqtgraph用户,尝试按照http://www.pyqtgraph.org/documentation/how_to_use.html中的说明“在WQt应用程序中嵌入小部件”。在我的例子中,我将Graphics视图提升为PlotWidget,然后保存为“test2.ui”,也遵循“十字准线/鼠标交互”示例,我的代码:
import sys
import numpy
from PyQt5 import QtCore, QtGui,uic,QtWidgets
from PyQt5.QtWidgets import *
import pyqtgraph as pg
import os
hw,QtBaseClass=uic.loadUiType("test.ui")
def gaussian(A, B, x):
return A * numpy.exp(-(x / (2. * B)) ** 2.)
class MyApp(QtWidgets.QMainWindow, hw):
def __init__(self):
super().__init__()
self.setupUi(self)
winSize=self.size()
self.view.resize(winSize.width(),winSize.height())
x = numpy.linspace(-5., 5., 10000)
y =gaussian(5.,0.2, x)
self.p=self.view.plot(x,y)
proxy = pg.SignalProxy(self.view.scene().sigMouseMoved, rateLimit=60, slot=self.mouseMoved)
self.view.enableAutoRange("xy", True)
def mouseMoved(evt):
print("mouseTest")
mousePoint = self.p.vb.mapSceneToView(evt[0])
label.setText(
"<span style='font-size: 14pt; color: white'> x = %0.2f, <span style='color: white'> y = %0.2f</span>" % (
mousePoint.x(), mousePoint.y()))
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = MyApp()
window.show()
sys.exit(app.exec_())
似乎没有得到鼠标移动事件; 改变之后 proxy = pg.SignalProxy(self.view.scene()。sigMouseMoved,rateLimit = 60,slot = self.mouseMoved) 至 self.view.scene()。sigMouseMoved.connect(self.mouseMoved), 输出“MouseTest”,但程序imediatly崩溃。 可以任何人给我一些帮助
答案 0 :(得分:0)
两件事:
回复:崩溃 看起来好像你没有在GUI中放置一个标签来修改,也许你的代码正在看到它并将它踢回给你。如果你正在使用qtDesigner,它可能被定义为self.label,在我的GUI中,我被要求使用self.label来引用它。
Re:mouseMoved函数
我只是在努力解决类似的问题。通过将evt[0]
更改为simply evt
,我能够让我的工作得到改善,我认为他们从pyqt4转移到了pyqt5。
以下是我能够开展工作的一个例子:
..........上面的设置代码...在setupUi函数中:
..........setup code above...
Plotted = self.plot
vLine = pg.InfiniteLine(angle=90, movable=False)
hLine = pg.InfiniteLine(angle=0, movable=False)
Plotted.addItem(vLine, ignoreBounds=True)
Plotted.addItem(hLine, ignoreBounds=True)
Plotted.setMouseTracking(True)
Plotted.scene().sigMouseMoved.connect(self.mouseMoved)
def mouseMoved(self,evt):
pos = evt
if self.plot.sceneBoundingRect().contains(pos):
mousePoint = self.plot.plotItem.vb.mapSceneToView(pos)
self.label.setText("<span style='font-size: 15pt'>X=%0.1f, <span style='color: black'>Y=%0.1f</span>" % (mousePoint.x(),mousePoint.y()))
self.plot.plotItem.vLine.setPos(mousePoint.x())
self.plot.plotItem.hLine.setPos(mousePoint.y()
...the if__name__ =="__main__": function .....
在我的情况下,我没有传递代理语句,而只是去了sigMouseMoved,因为它已经传递了代理的信息。我认为这是在pyqt5中的示例(并注释掉),因为它是变化。但是,评论没有明确说明这一点。