具有 64 位整数的 PyQt4 spinbox

发布于 2025-01-09 02:17:44 字数 112 浏览 8 评论 0原文

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

is it possible to modify the PyQt spinbox to work with integers bigger than 32bit (-2147483648 - 2147483647)? I know its possible to write a new spinbox in C++ with 64 bit int data type, but this would be to complicate.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

冷心人i 2025-01-16 02:17:44

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

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

如果您想要大于 2**53 的值,请子类 QAbstractSpinBox,重新实现相关方法(stepBystepEnabled验证 可能还有 fixup),然后提供任何其他方法(例如 value/setValue)您认为有必要的。

You can get a spin box with values greater than 32bit by using QDoubleSpinBox.

As the name suggests, this will give you double (i.e. floating-point) values with a maximum of 2**53 (9,007,199,254,740,992). If you want integer values, just set the precision to zero by using setDecimals(0). (NB: for some reason, Qt Designer won't allow you to set a maximum value greater than 99,999,999 for either of the built-in spin-boxes, so you'll have to do it "manually").

If you want values greater than 2**53, subclass QAbstractSpinBox, reimplement the relevant methods (stepBy, stepEnabled, validate and possibly fixup), and then provide whatever other methods (e.g. value/setValue) that you deem necessary.

葬心 2025-01-16 02:17:44

非常感谢您的提示。我尝试了 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

Many thanks for the hints. I tried the QDoubleSpinBox but didn't tried to set the values manually. Cause it doesn't fit my purposes I've written my own spinbox. Below the code. Maybe its helpful for someone else. Documentation about subclassing QAbstractSpinBox is a bit rare.
The default maximum is consistent with numpy.uint64's maximum. In theory there should be no limit, cause an QLineEdit is used for representation. If you need numbers longer than 20 signs simply adapt the validators regular expression.

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文