pyqtgpraph item无法拖动问题和无法触发事件

最近使用pyqtgraph写一点东西,想要通过鼠标拖动图元。
主要代码如下:

        self.parabolic_w = pg.PlotWidget()  # 锥镜
        self.parabolic_w.setAspectLocked()
        self.parabolicLayout.addWidget(self.parabolic_w)

        self.basic_profile_data = self.parabolic_w.plot((0,))  # 基本轮廓数据
        self.parabolic_w.addItem(self.basic_profile_data)
        self.basic_profile_data.setFlag(QGraphicsItem.ItemIsSelectable)
        self.basic_profile_data.setFlag(QGraphicsItem.ItemIsMovable)
        self.basic_profile_data.setAcceptDrops(True)
        self.basic_profile_data.setData(p.basic_profile)   # p.basic_profile 是numpy ndarry数据,在别处已生成,这里就只是简单贴过来演示
        self.basic_profile_data.sigClicked.connect(self.c)
        self.parabolic_center_data = self.parabolic_w.plot((0,0),(-0.1,3.1),pen=pg.mkPen(color='r', style=QtCore.Qt.DashDotLine))  # 注意线条笔刷
        self.parabolic_center_data.sigClicked.connect(self.c)

得到的图如下:

img

如上图,我想拖动白色线条却无法拖动,而且我点击该线条或者点击红色中心线,sigClicked的信号也没有被触发。
请教各位是怎么回事?

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/1095002
  • 这篇博客你也可以参考下:解决决策树可视化时python3.6没有PyGraphviz的问题
  • 这篇博客也不错, 你可以看下解决决策树可视化时python3.6没有PyGraphviz的问题
  • 除此之外, 这篇博客: python 滤波中的 使用pyqtgraph库实现数据可视化之逐点刷新波形图 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    加上滤波

    import pyqtgraph as pg
    import numpy as np
    import array
    from scipy import signal
    
    b, a = signal.butter(3, 0.05)
    zi = signal.lfilter_zi(b, a)
    dss = zi
    
    app = pg.mkQApp()
    data = array.array('d')
    data2 = array.array('d')
    data3 = array.array('d')
    # print(data)
    N = 200
    win = pg.GraphicsWindow()
    win.setWindowTitle(u'pyqtgraph逐点画波形图')
    win.resize(500,300)
    
    p = win.addPlot()
    p.showGrid(x=True,y=True)
    p.setRange(xRange=[0,N-1],yRange=[-1.2,1.2],padding=0)
    p.setLabels(left='y / V',bottom='x / point',title='y = sin(x)')
    
    curve = p.plot(pen='y')
    
    # q = win.addPlot()
    filter_curve = p.plot(pen='y')
    
    filter_curve_2 = p.plot(pen='y')
    idx = 0
    def plotData():
        global idx
        global dss
        global data3
        tmp =signal_xHz(1, 1,50, idx )# np.sin(np.pi / 50 * idx)
    #     print('dss',dss,'tmp',tmp)
        z, dss = signal.lfilter(b, a, tmp, zi=dss)
        if len(data)<N:
            data.append(tmp)      
            data2.append(z)
        else:
            data2[:-1] = data2[1:]
            data2[-1] = z
            data[:-1] = data[1:]
            data[-1] = tmp
            data3 = signal.filtfilt(b, a, data)
        curve.setData(data)
        filter_curve.setData(data2)
        filter_curve_2.setData(data3)
        idx += 1
    def signal_xHz(A, fi,sample, num ):
        return A * np.sin(np.pi * 2 * fi * num / sample )+ np.random.randn(1) * 0.08
    
    timer = pg.QtCore.QTimer()
    timer.timeout.connect(plotData)
    timer.start(30)
    app.exec_()

     

    filtfilt要多于12个点才能滤波,所以直接200个点后,才使用filtfilt滤波。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^