我正在设置一个自定义PlotDataItem来接收mouseDragEvents。我根据自己的需要调整了this answer。现在我刚刚在事件中添加了一个简单的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中,它实现了 curveDragged ,因此我知道正在拖动哪条曲线(如果有的话)。我还禁用了ViewBox的mouseDragEvents以进行调试。
然而,当尝试在ViewBox中拖动线时,没有任何反应。此外,如果我在mouseDragEvent顶部添加一个异常,则没有任何反应。这让我相信根本没有调用mouseDragEvent。
我正在使用Python 3.3(Anaconda Distribution)和pyqtgraph的开发版本(0.9.9)。
我希望有人可以帮我这个:)。提前谢谢。
答案 0 :(得分:1)
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)