我尝试对MouseInteraction example进行逆向工程,以便为已经正常运行的应用的GraphicsLayoutWidget
添加十字准线。请考虑阅读我的最后一段,因为这是我之前偶然发现的一个问题,但我还没有得到我需要的广泛可操作的反馈。
要显示的十字准线的水平和垂直线初始化如下
class MultiRoiViewBox(pg.ViewBox):
def __init__(self,parent=None,border=None,lockAspect=False,enableMouse=True,invertY=False,enableMenu=True,name=None):
pg.ViewBox.__init__(self,parent,border,lockAspect,enableMouse,invertY,enableMenu,name)
self.vLine = pg.InfiniteLine(angle=90, movable=False)
self.hLine = pg.InfiniteLine(angle=0, movable=False)
#Other initializations...
只有在通过GraphicsLayoutWidget
加载并显示图像后才会显示十字准线。当以下执行图像并显示十字准线时,SignalProxy
似乎没有建立正确的连接,因为十字准线不跟随鼠标。
def showImage(self,arr):
if arr==None:
self.img = None
return
if self.img==None:
self.img = pg.ImageItem(arr,autoRange=False,autoLevels=False)
self.addItem(self.img)
self.addItem(self.vLine, ignoreBounds=True)
self.addItem(self.hLine, ignoreBounds=True)
proxy = pg.SignalProxy(self.scene().sigMouseMoved, rateLimit=60, slot=self.mouseMoved)
self.img.setImage(arr,autoLevels=False)
self.updateView()
这是应该在鼠标移动时调用的函数。
def mouseMoved(self, ev):
pos = ev[0] ## using signal proxy turns original arguments into a tuple
if self.sceneBoundingRect().contains(pos):
mousePoint = self.vb.mapSceneToView(pos)
index = int(mousePoint.x())
self.vLine.setPos(mousePoint.x())
self.hLine.setPos(mousePoint.y())
我在mouseMoved
函数中有一个断点,它永远不会被触发,所以问题必须放在showImage
中的这一行:
proxy = pg.SignalProxy(self.scene().sigMouseMoved, rateLimit=60, slot=self.mouseMoved)
即使没有错误,我也不知道我应该在调试器中寻找什么,因为这行代码中的所有变量似乎都是有序的。我可以看到该场景是GraphicsScene
,但由于GraphicsLayoutWidget由GraphicsView
组成,我认为所有内容都是有序的
>>> pg
<module 'pyqtgraph' from '/usr/lib/python2.7/dist-packages/pyqtgraph/__init__.pyc'>
>>> self.scene()
<pyqtgraph.GraphicsScene.GraphicsScene.GraphicsScene object at 0x7f8aeb4ee640>
>>> self.scene().sigMouseMoved
<bound signal sigMouseMoved of GraphicsScene object at 0x7f8aeb4ee640>
>>> self.mouseMoved
<bound method MultiRoiViewBox.mouseMoved of <ViewBoxCustom.MultiRoiViewBox object at 0x7f8aeb4ee770>>
如果你看到了答案,我谦卑地要求你深入了解你是如何达到这个目标的。我不清楚在这种情况下应该采取适当的调试步骤。我已经确定了我确定必须引起问题的那一行,在这里有一个断点,我发现一切似乎都井然有序所以我是什么,一般来说,应该是在这样的困境中做什么?
我是pycharm专业用户,如果这有助于使解释更容易。
答案 0 :(得分:1)
你对问题所在的假设是正确的。您只是忘记了SignalProxy
必须是实例对象。在您的代码中,它是showImage
的本地变量。
所以添加一个自我。使用SignalProxy定义的行应该使您的代码工作:
self.proxy = pg.SignalProxy(self.scene().sigMouseMoved, rateLimit=60, slot=self.mouseMoved)
不要感到羞耻。我曾经犯过同样的错误,需要很长时间才能看到它。 :d
要清楚,因为我在评论中读到了barny的建议。只是添加self.scene().sigMouseMoved.connect(self.mouseMoved)
是错误的!它会起作用,因为根本不使用SignalProxy
。如果你添加了这个,你可以删除SignalProxy
行,它仍然可以使用。如果您更正了SignalProxy
行,则必须删除该行再说一遍。
我建议您使用SignalProxy
,因为您可以使用rateLimit
选项。在使用MouseMoved
或MouseDrag events
时,与您的情况一样,这一点尤为重要。否则,取决于代码量/计算量,可能会导致不流畅的运动,例如十字准线。
希望能帮到你或其他人。