是否可以修改PyQt spinbox以使用大于32位的整数(-2147483648 - 2147483647)?我知道可以在C ++中使用64位int数据类型编写一个新的spinbox,但这可能会变得复杂。
答案 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,则重新实现相关方法(stepBy,stepEnabled,validate以及可能fixup ),然后提供您认为必要的任何其他方法(例如value/setValue
)。