【发布时间】:2011-06-17 04:57:01
【问题描述】:
我想指定 QSlider 可以滑动的步骤,就像 QSpinBox 可以使用 setSingleStep 一样。我尝试使用 QAbstractSlider 的 setSingleStep,但这似乎没有效果。
有什么想法吗?
【问题讨论】:
标签: python qt pyqt qslider qabstractslider
我想指定 QSlider 可以滑动的步骤,就像 QSpinBox 可以使用 setSingleStep 一样。我尝试使用 QAbstractSlider 的 setSingleStep,但这似乎没有效果。
有什么想法吗?
【问题讨论】:
标签: python qt pyqt qslider qabstractslider
我扩展了 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)
【讨论】:
valueChanged 似乎仍然发出底层索引,而不是self.value()。我能够通过将一个新信号连接到发出self.value() 的valueChanged 来解决这个问题。谢谢!
尝试设置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_())
【讨论】:
slider.setTickInterval(50) 和 slider.setSingleStep(50),我仍然会得到 1 的步骤。有什么想法吗?