PyQtGraph自定义PlotDataItem未接收到mouseDragEvents

0 投票
1 回答
1595 浏览
提问于 2025-04-18 04:43

我正在设置一个自定义的PlotDataItem,用来接收鼠标拖动事件。我根据这个回答调整了代码。目前我只是简单地在事件中添加了一个setData,来检查它是否有效。这个自定义的PlotDataItem如下:

class CustomPlotItem(pg.PlotDataItem):
    def __init__(self, *args, **kargs):
        super().__init__(*args, **kargs)

    def setParentItem(self, parent):
        super().setParentItem(parent)
        self.parentBox = self.parentItem().parentItem()      

    def mouseDragEvent(self, ev):
        if ev.button() != QtCore.Qt.LeftButton:
            ev.ignore()
            return

        if ev.isStart():
            if self.parentBox.curveDragged != None or not self.mouseShape().contains(ev.pos()):
                ev.ignore()
                return
            self.parentBox.curveDragged = self            
        elif ev.isFinish():
            self.parentBox.curveDragged = None
            return
        elif self.parentBox.curveDragged != self:
            ev.ignore()
            return

        self.setData([40,50,60,200],[20,50,80,500])
        ev.accept()

这个PlotDataItem被添加到一个自定义的ViewBox中,这个ViewBox实现了curveDragged,这样我就能知道正在拖动的是哪条曲线(如果有的话)。为了调试,我还禁用了ViewBox的鼠标拖动事件。

但是,当我尝试在ViewBox中拖动这条线时,什么也没有发生。而且如果我在mouseDragEvent的顶部添加一个异常处理,依然没有反应。这让我觉得mouseDragEvent根本没有被调用。

我使用的是Python 3.3(Anaconda发行版)和pyqtgraph的开发版本(0.9.9)。

希望有人能帮我解决这个问题 :)。提前谢谢大家。

1 个回答

2

PlotDataItem 是一个包装器,它包裹了 PlotCurveItemScatterPlotItem。简单来说,它自己并没有任何图形或者可以点击的形状。我建议你可以尝试创建一个 PlotCurveItem 的子类。如果你确实需要使用 PlotDataItem,那么可以对它进行修改,让它从被包装的曲线中继承形状:

class CustomPlotItem(pg.PlotDataItem):
    def __init__(self, *args, **kargs):
        super().__init__(*args, **kargs)
        # Need to switch off the "has no contents" flag
        self.setFlags(self.flags() & ~self.ItemHasNoContents)

    def mouseDragEvent(self, ev):
        print("drag")
        if ev.button() != QtCore.Qt.LeftButton:
            ev.ignore()
            return

        if ev.isStart():
            print("start")
        elif ev.isFinish():
            print("finish")

    def shape(self):
        # Inherit shape from the curve item
        return self.curve.shape()

    def boundingRect(self):
        # All graphics items require this method (unless they have no contents)
        return self.shape().boundingRect()

    def paint(self, p, *args):
        # All graphics items require this method (unless they have no contents)
        return

    def hoverEvent(self, ev):
        # This is recommended to ensure that the item plays nicely with 
        # other draggable items
        print("hover")
        ev.acceptDrags(QtCore.Qt.LeftButton)

撰写回答