QSlider 步进设置?

7 投票
4 回答
17815 浏览
提问于 2025-04-16 10:47

我想设置一个QSlider滑动的步长,就像QSpinBox可以通过setSingleStep来设置一样。我尝试使用QAbstractSlider的setSingleStep,但似乎没有任何效果。

有没有什么好主意?

4 个回答

0

我的解决方案是使用信号 sliderMoved 来调整滑块的位置。下面的例子会把滑块移动到值50或100。

import sys
from PyQt5.QtGui import QApplication, QSlider, QMainWindow

class Window(QMainWindow):
    def __init__(self, parent = None):
        super(Window, self).__init__(parent)

        self.slider = QSlider(self)
        self.slider.setMinimum(0)
        self.slider.setMaximum(100)

        self.slider.setTickInterval(20)
        self.slider.setSingleStep(20)

        self.slider.sliderMoved.connect(self.correct_pos)    

        self.setCentralWidget(self.slider)
     
    def correct_pos(self, pos):
        if pos < 50:
            corrected = 50
        else:
            corrected = 100
        self.slider.setValue(corrected)


if __name__ == "__main__":
    app = QApplication(sys.argv)

    window = Window()
    window.show()

    sys.exit(app.exec_())
1

我扩展了QSlider类,目的是限制用户,让他们无法在步骤之间拖动滑块。SetInterval方法就像是把setTickIntervalsetSingleStep这两个方法结合在一起,但它还可以防止滑块停在刻度值之间。

这个类还允许使用浮点数作为滑块的限制或间隔,并且可以设置和读取滑块上选定点的索引。

class DoubleSlider(qw.QSlider):

    def __init__(self, *args, **kargs):
        super(DoubleSlider, self).__init__( *args, **kargs)
        self._min = 0
        self._max = 99
        self.interval = 1

    def setValue(self, value):
        index = round((value - self._min) / self.interval)
        return super(DoubleSlider, self).setValue(index)

    def value(self):
        return self.index * self.interval + self._min

    @property
    def index(self):
        return super(DoubleSlider, self).value()

    def setIndex(self, index):
        return super(DoubleSlider, self).setValue(index)

    def setMinimum(self, value):
        self._min = value
        self._range_adjusted()

    def setMaximum(self, value):
        self._max = value
        self._range_adjusted()

    def setInterval(self, value):
        # To avoid division by zero
        if not value:
            raise ValueError('Interval of zero specified')
        self.interval = value
        self._range_adjusted()

    def _range_adjusted(self):
        number_of_steps = int((self._max - self._min) / self.interval)
        super(DoubleSlider, self).setMaximum(number_of_steps)
9

试着设置一下 tickInterval

编辑

抱歉之前没想到 tickInterval 的问题,不过我有一段可以正常工作的代码,它能用 setSingleStep 实现你想要的效果。

import sys
from PyQt4.QtGui import QApplication, QSlider, QMainWindow

class Window(QMainWindow):
    def __init__(self, parent = None):
        super(Window, self).__init__(parent)

        slider = QSlider()
        slider.setMinimum(0)
        slider.setMaximum(100)

        slider.setTickInterval(20)
        slider.setSingleStep(20)


        self.setCentralWidget(slider)


if __name__ == "__main__":
    app = QApplication(sys.argv)

    window = Window()
    window.show()

    sys.exit(app.exec_())

撰写回答