У вас есть два варианта:
- Вы можете создать подкласс
QSpinBox
, переопределить validate
метод и использовать соответствующий Q*Validator
(например, QRegExpValidator
) внутри.
- Вы можете проверить значение в слоте, подключенном к
valueChanged
перед использованием, и при необходимости исправить его.
Поскольку вы уже используете сигнал valueChanged
, второй вариант должен быть достаточно простым для реализации. Просто измените свой change_value
метод следующим образом:
def change_value1(self, val): # new value is passed as an argument
# so no need for this
# val = self.spinbox1.value()
new_val = round(val*5)/5 # one way to fix
if val != new_val: # if value is changed, put it in the spinbox
self.spinbox1.setValue(new_val)
self.lcd1.display(new_val)
Кстати, поскольку вы используете только одну десятичную точность, было бы логично также использовать:
self.spinbox1.setDecimals(1)
в вашем __init__
. И попробуйте использовать новый стиль сигналов и слотов . i.e.:
self.connect(self.spinbox1, SIGNAL('valueChanged(double)'), self.change_value1)
можно записать как:
self.spinbox1.valueChanged[float].connect(self.change_value1)
Редактировать
подклассы:
class MySpinBox(QDoubleSpinBox):
def __init__(self, parent=None):
super(MySpinBox, self).__init__(parent)
# any RegExp that matches the allowed input
self.validator = QRegExpValidator(QRegExp("\\d+[\\.]{0,1}[02468]{0,1}"), self)
def validate(self, text, pos):
# this decides if the entered value should be accepted
return self.validator.validate(text, pos)
тогда вместо QDoubleSpinBox
вы бы использовали MySpinBox
и оставили бы проверку ввода этому классу.