【问题标题】:QSlider stepping?QSlider 步进?
【发布时间】:2011-06-17 04:57:01
【问题描述】:

我想指定 QSlider 可以滑动的步骤,就像 QSpinBox 可以使用 setSingleStep 一样。我尝试使用 QAbstractSlider 的 setSingleStep,但这似乎没有效果。

有什么想法吗?

【问题讨论】:

    标签: python qt pyqt qslider qabstractslider


    【解决方案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)
    

    【讨论】:

    • 这太好了,谢谢!我发现valueChanged 似乎仍然发出底层索引,而不是self.value()。我能够通过将一个新信号连接到发出self.value()valueChanged 来解决这个问题。谢谢!
    【解决方案2】:

    尝试设置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_())
    

    【讨论】:

    • 到目前为止效果很好,谢谢!但是用户仍然能够跟踪滑块到步骤之间的值。如何预防?
    • 我认为没有比这更多的事情要做了,也许如果你能提供一些背景,我可以提供另一种方法
    • 假设有一个 QSlider,其最小值为 0,最大值为 100。现在用户应该能够选择 0、10、20、..、90、100,但是不是 1,2,3,..21,22,23,..91,92,93...,99 通过移动滑动旋钮。
    • 可能,但不纯。例如使用信号和插槽连接滑块和步进器将无法正常工作。
    • 这似乎不适用于 PyQt5,即使我设置了 slider.setTickInterval(50)slider.setSingleStep(50),我仍然会得到 1 的步骤。有什么想法吗?
    猜你喜欢
    • 2012-09-06
    • 2012-03-13
    • 2013-09-30
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多