在PyQtGraph上放大/缩小时从PyQt更新滑块

问题描述 投票:0回答:1

抱歉,我是Python新手。我想在放大时(用鼠标滚轮在图上滚动)将PyQt滑块(valueChanged.connect)中的更新与PyQtGraph(sigRangeChanged.connect)中的更新连接。

我想根据屏幕上显示的范围更新X范围间隔。例如。如果要缩小,则应遵循滑块范围(xmin-xmax)。因此,我想以某种方式连接以下定义。

def update_plot(self):
    self.axX = self.p6.getAxis('bottom')
    self.xmin = self.axX.range[0]
    self.xmax = self.axX.range[0]
    print(self.axX.range)
    return xmin, xmax

def update_slider(self, xmin, xmax):
    self.size = self.w1.slider.value()
    self.p6.setXRange(self.xmin+self.size,self.xmax+self.size)
    print(self.size)

但是,我似乎无法使其正常工作。我已在下面附上示例的完整代码。您能以任何方式帮助我吗?

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QHBoxLayout, QLabel, QSizePolicy, QSlider, QSpacerItem, \
    QVBoxLayout, QWidget

import pyqtgraph as pg
import numpy as np


class Slider(QWidget):
    def __init__(self, minimum, maximum, parent=None):
        super(Slider, self).__init__(parent=parent)
        self.verticalLayout = QVBoxLayout(self)
        self.label = QLabel(self)
        self.verticalLayout.addWidget(self.label)
        self.horizontalLayout = QHBoxLayout()
        spacerItem = QSpacerItem(0, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem)
        self.slider = QSlider(self)
        self.slider.setOrientation(Qt.Vertical)
        self.horizontalLayout.addWidget(self.slider)
        spacerItem1 = QSpacerItem(0, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem1)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.resize(self.sizeHint())

        self.minimum = minimum
        self.maximum = maximum
        self.slider.valueChanged.connect(self.setLabelValue)
        self.x = None
        self.setLabelValue(self.slider.value())

    def setLabelValue(self, value):
        self.x = self.minimum + (float(value) / (self.slider.maximum() - self.slider.minimum())) * (
        self.maximum - self.minimum)
        self.label.setText("{0:.4g}".format(self.x))

class Widget(QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent=parent)
        self.horizontalLayout = QHBoxLayout(self)

        # plot (p6)
        self.win = pg.GraphicsWindow(title="Basic plotting examples")
        self.horizontalLayout.addWidget(self.win)
        self.p6 = self.win.addPlot(title="My Plot")
        x = np.arange(1e5)
        self.y1 = np.random.randn(x.size)
        self.p6.plot(self.y1, pen="r")
        self.p6.setMouseEnabled(x=True, y=False)
        self.p6.setXRange(0,300)
        self.p6.setLimits(xMin=0, xMax=len(self.y1))

        self.p6.sigRangeChanged.connect(self.update_plot)

        # slider (w1)
        self.w1 = Slider(0, len(self.y1))
        self.horizontalLayout.addWidget(self.w1)        
        self.w1.slider.setMinimum(0)
        self.w1.slider.setMaximum(len(self.y1))

        self.w1.slider.valueChanged.connect(self.update_slider)

    def update_plot(self):
        self.axX = self.p6.getAxis('bottom')
        self.xmin = self.axX.range[0]
        self.xmax = self.axX.range[0]
        print(self.axX.range)
        return self.xmin, self.xmax


    def update_slider(self, xmin, xmax):
        self.size = self.w1.slider.value()
        self.p6.setXRange(self.xmin+self.size,self.xmax+self.size)
        print(self.size)



if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())
python pyqt pyqt5 pyqtgraph
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.