7FFFFFFF 边界,我就会在插槽运行后抛出 OverflowError 异常。如果我或 -6ren">
gpt4 book ai didi

python - 在 Pyside 中,为什么在处理信号后发出大于 0x7FFFFFFF 的整数会导致 "OverflowError"?

转载 作者:太空狗 更新时间:2023-10-30 01:09:42 28 4
gpt4 key购买 nike

我正在尝试使用具有 0 - 2^32-1 范围内大整数的信号/槽。我发现了一些奇怪的东西——一旦我发出 > 7FFFFFFF 边界,我就会在插槽运行后抛出 OverflowError 异常。如果我或 QT 在另一种语言(如 C 或 C++)中明确使用带符号的 32 位整数,我可能会预料到这种溢出——因为我们都知道 0x80000000 以 2s 补码表示法返回到 -2^31。但是在 python 中,它只是 2^32 没有包装。我在编写代码时的假设是这是 python 并且内置的 int 可以变得非常大(也许是任意的?)并且我不需要明确地将某些东西定义为 32 位或 64 位或有符号/无符号。这一切都会奏效。

下面的代码演示了我所看到的(Python 2.7.2(64 位)、Pyside 1.1.0、Windows 7)

from PySide.QtCore import *

@Slot(int)
def say(i):
print "Say %i" % i

class Communicate(QObject):
speak = Signal(int)

someone = Communicate()
someone.speak.connect(say)
someone.speak.emit(0x7FFFFFFF) #works fine
someone.speak.emit(0x80000000) #OverflowError after slot "say" runs
say(0x80000000) #works fine

准确的输出是:

Say 2147483647Say -2147483648OverflowErrorSay 2147483648
  1. 为什么 Qt 似乎将整数类型的信号/槽视为处理带符号的 32 位整数而不是 python 内置整数?
  2. 如果这是 Qt 的限制,我该怎么做才能将 int 标记为无符号或确保 QT 可以处理大于 0x7FFFFFFF 的整数?

最佳答案

我主要是 PyQt 用户,但我相信行为是相似的。信号定义中的 int 被映射到 4 字节整数(因为 Qt 理解 int)。

一种可能的解决方案是强制信号发出 Python 对象。这有效:

class Communicate(QObject):
speak = Signal(object)

但请注意,如果将此信号连接到需要 Qt 版本的 int(例如 QtGui.QSpinBox.setMaximum)的插槽,您将看到相同的行为。除此之外,纯粹在 Python 端使用此信号应该没问题。

关于python - 在 Pyside 中,为什么在处理信号后发出大于 0x7FFFFFFF 的整数会导致 "OverflowError"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10762809/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com