QSlider 步进设置?
我想设置一个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
方法就像是把setTickInterval
和setSingleStep
这两个方法结合在一起,但它还可以防止滑块停在刻度值之间。
这个类还允许使用浮点数作为滑块的限制或间隔,并且可以设置和读取滑块上选定点的索引。
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_())