0

カスタム PlotDataItem を設定して、mouseDragEvents を受け取ります。この回答を自分のニーズに合わせて調整しました。今のところ、単純な 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 は、 curveDraggedを実装するカスタム ViewBox に追加されるため、どの曲線がドラッグされているかがわかります。また、デバッグ目的で ViewBox の mouseDragEvents を無効にしました。

ただし、ViewBox で線をドラッグしようとすると、何も起こりません。また、mouseDragEvent の先頭に例外を追加しても、何も起こりません。これにより、 mouseDragEvent がまったく呼び出されていないと思います。

Python 3.3 (Anaconda Distribution) と pyqtgraph の開発バージョン (0.9.9) を使用しています。

誰かがこれで私を助けてくれることを願っています:)。前もって感謝します。

4

1 に答える 1

2

PlotDataItemPlotCurveItemaとa のラッパー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)
于 2014-04-29T22:18:36.063 に答える