Python 当可拖动线接近X范围端点时,如何将pyqtgraph的X轴向后移动到第四个?

Python 当可拖动线接近X范围端点时,如何将pyqtgraph的X轴向后移动到第四个?,python,pyqt,pyqtgraph,Python,Pyqt,Pyqtgraph,我有一个pyqtgraph plotwidget显示一条曲线,由于数据数组很大,我只显示有限的X轴范围。我想使用一条可拖动的线将X轴向后推,当线被拖近并通过X范围的端点时,将其推到第四个 这是我做的。但是,在全屏显示时,当鼠标无法进一步移动到屏幕的右侧或左侧时,拖动事件将停止更新 即使鼠标处于静止状态但接近X范围的端点,如何继续更新X轴 示例代码: # Import packages from PyQt5.QtWidgets import QApplication, QWidget, QVBox

我有一个pyqtgraph plotwidget显示一条曲线,由于数据数组很大,我只显示有限的X轴范围。我想使用一条可拖动的线将X轴向后推,当线被拖近并通过X范围的端点时,将其推到第四个

这是我做的。但是,在全屏显示时,当鼠标无法进一步移动到屏幕的右侧或左侧时,拖动事件将停止更新

即使鼠标处于静止状态但接近X范围的端点,如何继续更新X轴

示例代码:

# Import packages
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout
import numpy as np
import sys
import pyqtgraph as pg

class MainWindow(QWidget):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.verticalLayout = QVBoxLayout(self)

        # Add graph plot
        self.graph = pg.PlotWidget()
        self.verticalLayout.addWidget(self.graph)

        # Set view range to 200 as default
        self.startX = 0
        self.endX = 200

        self.graph.setMouseEnabled(x=False, y=False)  # disable mouse events in graph
        self.graph.hideButtons()
        self.graph.setXRange(self.startX, self.endX, padding=0) # Set view range to 200 as default
        self.curve = self.graph.plot(pen="w") # Add line to plot

        data = np.random.random(size=10000)

        self.curve.setData(data)

        # Add line to graph plot
        self.vLine = pg.InfiniteLine(movable=True, angle=90, pen=[75, 82, 159, 200])
        self.graph.addItem(self.vLine)
        self.vLine.setPos(100)
        self.graph.scene().sigMouseClicked.connect(self.moveLine)
        self.vLine.sigDragged.connect(self.pushLine)

        self.setLayout(self.verticalLayout)

    def pushLine(self):
        pos = self.vLine.getPos()
        axX = self.graph.getAxis('bottom')

        while pos[0] <= axX.range[0]:
            self.graph.setXRange(axX.range[0]-1, axX.range[1]-1, padding=0)

        while pos[0] >= axX.range[1]:
            self.graph.setXRange(axX.range[0]+1, axX.range[1]+1, padding=0)

    def moveLine(self, mouse_event):
        vb = self.graph.getViewBox()
        view_coords = vb.mapSceneToView(mouse_event.scenePos())
        view_x = view_coords.x()
        self.vLine.setPos(view_x)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MainWindow()
    ex.show()
    sys.exit(app.exec_())
#导入软件包
从PyQt5.QtWidgets导入QApplication、QWidget、QVBoxLayout
将numpy作为np导入
导入系统
将pyqtgraph作为pg导入
类主窗口(QWidget):
def uuu init uuu(self,parent=None):
超级(主窗口,自我)。\uuuuu初始化\uuuuuuu(父级)
self.verticalLayout=QVBoxLayout(self)
#添加图形打印
self.graph=pg.PlotWidget()
self.verticalLayout.addWidget(self.graph)
#将“视图范围”设置为默认值200
self.startX=0
self.endX=200
self.graph.setMouseEnabled(x=False,y=False)#禁用图形中的鼠标事件
self.graph.hideButtons()
self.graph.setXRange(self.startX,self.endX,padding=0)#将视图范围设置为默认值200
self.curve=self.graph.plot(pen=“w”)#向plot添加线条
数据=np.random.random(大小=10000)
self.curve.setData(数据)
#将线添加到图表中
self.vLine=pg.InfiniteLine(movable=True,angle=90,pen=[75,82,159,200])
self.graph.addItem(self.vLine)
自动线设置位置(100)
self.graph.scene().sigMouseClicked.connect(self.moveLine)
self.vLine.sigdrable.connect(self.pushLine)
self.setLayout(self.verticalLayout)
def推绳(自):
pos=self.vLine.getPos()
axX=self.graph.getAxis('bottom')
当位置[0]=轴范围[1]时:
self.graph.setXRange(axX.range[0]+1,axX.range[1]+1,padding=0)
def moveLine(自身、鼠标事件):
vb=self.graph.getViewBox()
view\u coords=vb.MapScenetView(鼠标\u事件.scenePos())
view_x=view_coords.x()
self.vLine.setPos(视图x)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app=QApplication(sys.argv)
ex=主窗口()
例如:show()
sys.exit(app.exec_())

我想出来了。我必须添加一个QTimer,当我拖动线时它会启动,当释放线时它会再次停止。这在拖动时创建了一个不断更新的信号。请参阅下面的代码:

# Import packages
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout
from PyQt5.QtCore import QTimer
import numpy as np
import sys
import pyqtgraph as pg

class MainWindow(QWidget):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.verticalLayout = QVBoxLayout(self)

        # Add graph plot
        self.graph = pg.PlotWidget()
        self.verticalLayout.addWidget(self.graph)

        # Set view range to 200 as default
        self.startX = 0
        self.endX = 200

        self.graph.setMouseEnabled(x=False, y=False)  # disable mouse events in graph
        self.graph.hideButtons()
        self.graph.setXRange(self.startX, self.endX, padding=0) # Set view range to 200 as default
        self.curve = self.graph.plot(pen="w") # Add line to plot

        data = np.random.random(size=10000)

        self.curve.setData(data)

        # Add line to graph plot
        self.vLine = pg.InfiniteLine(movable=True, angle=90, pen=[75, 82, 159, 200])
        self.graph.addItem(self.vLine)
        self.vLine.setPos(100)
        self.graph.scene().sigMouseClicked.connect(self.moveLine)

        self.setLayout(self.verticalLayout)

        self.playTimer = QTimer()
        self.proxy = pg.SignalProxy(self.graph.scene().sigMouseMoved, rateLimit=30, slot=self.OnMouseMove)
        self.graph.scene().sigMouseClicked.connect(self.release)
        self.playTimer.timeout.connect(self.release)

    def release(self):
        pos = self.vLine.getPos()
        axX = self.graph.getAxis('bottom')

        if pos[0] <= axX.range[0]:
            self.graph.setXRange(axX.range[0]-1, axX.range[1]-1, padding=0)
            self.vLine.setPos(axX.range[0])

        if pos[0] >= axX.range[1]:
            self.graph.setXRange(axX.range[0]+1, axX.range[1]+1, padding=0)
            self.vLine.setPos(axX.range[1])

        if not self.graph.scene().clickEvents:  # Drag function
            self.playTimer.stop()

    def OnMouseMove(self):
        if not self.playTimer.isActive() and self.graph.scene().clickEvents:
            self.playTimer.start(10)  # After a drag release, this is the "wait" time before self.release is called.

    def moveLine(self, mouse_event):
        vb = self.graph.getViewBox()
        view_coords = vb.mapSceneToView(mouse_event.scenePos())
        view_x = view_coords.x()
        self.vLine.setPos(view_x)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MainWindow()
    ex.show()
    sys.exit(app.exec_())
#导入软件包
从PyQt5.QtWidgets导入QApplication、QWidget、QVBoxLayout
从PyQt5.QtCore导入QTimer
将numpy作为np导入
导入系统
将pyqtgraph作为pg导入
类主窗口(QWidget):
def uuu init uuu(self,parent=None):
超级(主窗口,自我)。\uuuuu初始化\uuuuuuu(父级)
self.verticalLayout=QVBoxLayout(self)
#添加图形打印
self.graph=pg.PlotWidget()
self.verticalLayout.addWidget(self.graph)
#将“视图范围”设置为默认值200
self.startX=0
self.endX=200
self.graph.setMouseEnabled(x=False,y=False)#禁用图形中的鼠标事件
self.graph.hideButtons()
self.graph.setXRange(self.startX,self.endX,padding=0)#将视图范围设置为默认值200
self.curve=self.graph.plot(pen=“w”)#向plot添加线条
数据=np.random.random(大小=10000)
self.curve.setData(数据)
#将线添加到图表中
self.vLine=pg.InfiniteLine(movable=True,angle=90,pen=[75,82,159,200])
self.graph.addItem(self.vLine)
自动线设置位置(100)
self.graph.scene().sigMouseClicked.connect(self.moveLine)
self.setLayout(self.verticalLayout)
self.playTimer=QTimer()
self.proxy=pg.SignalProxy(self.graph.scene().sigMouseMoved,rateLimit=30,slot=self.OnMouseMove)
self.graph.scene().sigMouseClicked.connect(self.release)
self.playTimer.timeout.connect(self.release)
def释放(自):
pos=self.vLine.getPos()
axX=self.graph.getAxis('bottom')
如果位置[0]=轴范围[1]:
self.graph.setXRange(axX.range[0]+1,axX.range[1]+1,padding=0)
self.vLine.setPos(axX.range[1])
如果不是self.graph.scene().clickEvents:#拖动函数
self.playTimer.stop()
def OnMouseMove(自):
如果不是self.playTimer.isActive()和self.graph.scene()。单击事件:
self.playTimer.start(10)#拖动释放后,这是调用self.release之前的“等待”时间。
def moveLine(自身、鼠标事件):
vb=self.graph.getViewBox()
view\u coords=vb.MapScenetView(鼠标\u事件.scenePos())
view_x=view_coords.x()
self.vLine.setPos(视图x)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app=QApplication(sys.argv)
ex=主窗口()
例如:show()
sys.exit(app.exec_())