我已经为执行一些几何计算的脚本编写了GUI。某些值范围破坏了计算(例如,找到两个不相交的形状的交集)。在这些情况下,我提出了例外。我想防止用户将Spinbox值调整为超出引发异常的程度。
我尝试覆盖QDoubleSpinBox的验证器方法。当我使用键盘手动输入值时,这非常有用。但是,这并不能阻止我单击向上和向下箭头。
如何限制用户增加超出可接受范围的值的能力?
注意:实际的some_complicated_function
涉及5个不同旋转框的值。
from PyQt4 import QtCore, QtGui
import sys
def some_complicated_function(val_a):
if val_a + 3 < 10:
return True
else:
raise Exception("Giant number!")
class SpinBoxSpecial(QtGui.QDoubleSpinBox):
def validate(self, value, pos):
# print float(value)
try:
some_complicated_function(float(value))
print "yup"
return QtGui.QValidator.Acceptable, QtGui.QValidator.Acceptable
except:
print "nope"
return QtGui.QValidator.Invalid, QtGui.QValidator.Invalid
a = QtGui.QApplication(sys.argv)
w = QtGui.QMainWindow()
w.resize(320, 100)
w.setWindowTitle("PyQT Python Widget!")
spinbox = SpinBoxSpecial(w)
spinbox.move(20, 20)
spinbox.CorrectionMode = QtGui.QAbstractSpinBox.CorrectToPreviousValue
w.show()
sys.exit(a.exec_())
编辑:
基本要求是:我想在旋转框的值更改时(通过鼠标或键盘)调用一个函数。如果该函数引发异常,我希望Spinbox的值恢复为原来的值。
最佳答案
这是一种在Spinbox上动态设置范围的简单方法:
class SpinBoxSpecial(QtGui.QDoubleSpinBox):
def __init__(self, parent=None):
super(SpinBoxSpecial, self).__init__(parent)
self._last = self.value()
self.valueChanged.connect(self.handleValueChanged)
def handleValueChanged(self, value):
try:
some_complicated_function(float(value))
print "yup", value
self._last = value
except:
print "nope", value
if value > self._last:
self.setMaximum(self._last)
else:
self.setMinimum(self._last)
编辑:
刚刚意识到,如果直接输入一个值,上述方法将无法正常工作,因为它可能过早确定最小值/最大值。所以也许这会更好:
def handleValueChanged(self, value):
try:
some_complicated_function(float(value))
print "yup", value
self._last = value
except:
print "nope", value
self.setValue(self._last)