具有64位整数的PyQt4 spinbox

时间:2014-11-10 09:58:01

标签: qt4 pyqt4 biginteger

是否可以修改PyQt spinbox以使用大于32位的整数(-2147483648 - 2147483647)?我知道可以在C ++中使用64位int数据类型编写一个新的spinbox,但这可能会变得复杂。

2 个答案:

答案 0 :(得分:2)

非常感谢提示。我尝试了QDoubleSpinBox,但没有尝试手动设置值。因为它不符合我的目的我写了自己的旋转盒。代码下方。也许它对其他人有帮助。有关子类化QAbstractSpinBox的文档有点罕见。 默认最大值与numpy.uint64的最大值一致。理论上应该没有限制,因为QLineEdit用于表示。如果您需要超过20个符号的数字,只需调整验证器的正则表达式。

class BigIntSpinbox(QtGui.QAbstractSpinBox):

    def __init__(self, parent=None):
        super(BigIntSpinbox, self).__init__(parent)

        self._singleStep = 1
        self._minimum = -18446744073709551616
        self._maximum = 18446744073709551615

        self.lineEdit = QtGui.QLineEdit(self)

        rx = QtCore.QRegExp("[1-9]\\d{0,20}")
        validator = QtGui.QRegExpValidator(rx, self)

        self.lineEdit.setValidator(validator)
        self.setLineEdit(self.lineEdit)

    def value(self):
        try:
            return int(self.lineEdit.text())
        except:
            raise
            return 0

    def setValue(self, value):
        if self._valueInRange(value):
            self.lineEdit.setText(str(value))

    def stepBy(self, steps):
        self.setValue(self.value() + steps*self.singleStep())

    def stepEnabled(self):
        return self.StepUpEnabled | self.StepDownEnabled

    def setSingleStep(self, singleStep):
        assert isinstance(singleStep, int)
        # don't use negative values
        self._singleStep = abs(singleStep)

    def singleStep(self):
        return self._singleStep

    def minimum(self):
        return self._minimum

    def setMinimum(self, minimum):
        assert isinstance(minimum, int) or isinstance(minimum, long)
        self._minimum = minimum

    def maximum(self):
        return self._maximum

    def setMaximum(self, maximum):
        assert isinstance(maximum, int) or isinstance(maximum, long)
        self._maximum = maximum

    def _valueInRange(self, value):
        if value >= self.minimum() and value <= self.maximum():
            return True
        else:
            return False

答案 1 :(得分:0)

使用QDoubleSpinBox可以获得值大于32位的旋转框。

顾名思义,这将给你双倍(即浮点)值,最大值为2 ** 53(9,007,199,254,740,992)。如果需要整数值,只需使用setDecimals(0)将精度设置为零。 (注意:出于某种原因,Qt Designer不允许您为任何一个内置旋转框设置大于99,999,999的最大值,因此您必须“手动”执行此操作。)

如果您希望值大于2 ** 53,子类QAbstractSpinBox,则重新实现相关方法(stepBystepEnabledvalidate以及可能fixup ),然后提供您认为必要的任何其他方法(例如value/setValue)。