当可拖动线接近X范围结束时,如何将pyqtgraph的X轴前后移动



我有一个显示曲线的pyqtgraph绘图小部件,由于数据数组很大,我只显示X轴的有限范围。我想用一条可拖动的线将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_())

我想明白了。我必须添加一个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_())

最新更新