【发布时间】:2017-01-26 12:10:43
【问题描述】:
假设我希望 QSpinBox 具有从 0 到 10 的有效值,步长为 2(即 0、2、4、6、8、10)。
我可以将QSpinBox 设置为最小值为 0,最大值为 10,单步为 2。如果用户单击向上/向下箭头,则效果很好。但是,如果用户输入一个奇数(比如 3),旋转框仍然认为它是有效的并接受它。
在这种情况下,我应该怎么做才能让我的 QSpinBox 不允许奇数?
【问题讨论】:
假设我希望 QSpinBox 具有从 0 到 10 的有效值,步长为 2(即 0、2、4、6、8、10)。
我可以将QSpinBox 设置为最小值为 0,最大值为 10,单步为 2。如果用户单击向上/向下箭头,则效果很好。但是,如果用户输入一个奇数(比如 3),旋转框仍然认为它是有效的并接受它。
在这种情况下,我应该怎么做才能让我的 QSpinBox 不允许奇数?
【问题讨论】:
要纠正这个问题,你可以实现 valueChanged 信号,验证值是否正确,如果不是 modicas nothing,相反如果不是,则放置之前的值。
示例:
import sys
from PyQt4.QtCore import pyqtSignal
from PyQt4.QtGui import QApplication, QSpinBox
class SpinBox(QSpinBox):
# Replaces the valueChanged signal
newValueChanged = pyqtSignal(int)
def __init__(self, parent=None):
super(SpinBox, self).__init__(parent=parent)
self.valueChanged.connect(self.onValueChanged)
self.before_value = self.value()
self.newValueChanged.connect(self.slot)
def onValueChanged(self, i):
if not self.isValid(i):
self.setValue(self.before_value)
else:
self.newValueChanged.emit(i)
self.before_value = i
def isValid(self, value):
if (self.minimum() - value % self.singleStep()) == 0:
return True
return False
def slot(self, value):
print(value)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = SpinBox()
w.setMinimum(0)
w.setMaximum(10)
w.setSingleStep(2)
w.show()
sys.exit(app.exec_())
【讨论】: