pyqt4十字线不跟随GraphicsLayoutWidget中的鼠标移动。我该如何有效地调试这个?

时间:2016-03-23 07:36:24

标签: python pyqt4 pycharm pyqtgraph

我尝试对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,但由于GraphicsLayoutWidgetGraphicsView组成,我认为所有内容都是有序的

>>> 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专业用户,如果这有助于使解释更容易。

1 个答案:

答案 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选项。在使用MouseMovedMouseDrag events时,与您的情况一样,这一点尤为重要。否则,取决于代码量/计算量,可能会导致不流畅的运动,例如十字准线。

希望能帮到你或其他人。