如何防止QDoubleSpinBox更改值

时间:2016-03-02 23:48:30

标签: python pyqt

我为一个执行一些几何计算的脚本编写了一个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的值恢复到原来的状态。

1 个答案:

答案 0 :(得分:1)

以下是在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)

修改

刚刚意识到如果直接键入值,上面的内容将无法正常工作,因为它可以过早地修复min / max。所以也许这会更好:

    def handleValueChanged(self, value):
        try:
            some_complicated_function(float(value))
            print "yup", value
            self._last = value
        except:
            print "nope", value
            self.setValue(self._last)