PyQtGraph自定义PlotDataItem未接收到mouseDragEvents
我正在设置一个自定义的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
是一个包装器,它包裹了 PlotCurveItem
和 ScatterPlotItem
。简单来说,它自己并没有任何图形或者可以点击的形状。我建议你可以尝试创建一个 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)