在PYSIDE中,为什么在信号处理后发出一个整数>;0x7FFFFFFFF会导致";Overflow Error";?
问题描述
我正在尝试使用0-2^32-1范围内的大整数的信号/槽。我发现了一些奇怪的事情--一旦我发出>7FFFFFFF边界,就会在槽运行后抛出Overflow Error异常。如果I或Qt在另一种语言(如C或C++)中显式使用带符号的32位整数,我可能会预料到这种溢出--正如我们都知道的那样,0x80000000在2s补码表示法中折回到-2^31。然而,在Python中,没有包装的话只有2^32。不过,我在编写代码时的假设是,这是一个PYTHON,内置的int可以变得非常大(可能是任意的,所以呢?)我不需要明确地定义32或64位或有符号/无符号的东西。这一切都会奏效的。
下面的代码演示了我所看到的(Python2.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 2147483647 Say -2147483648 OverflowError Say 2147483648
- 为什么Qt似乎将INTEGER类型的信号/槽视为处理带符号的32位整数,而不是处理PYTHON内置INT?
- 如果这是Qt的限制,我如何才能将int标记为无符号或确保Qt可以处理>0x7FFFFFFFF?
解决方案
我主要是一名PYQT用户,但我相信他们的行为是相似的。信号定义中的int
被映射到4字节整数(正如Qt对int
的理解)。
class Communicate(QObject):
speak = Signal(object)
但请注意,如果将此信号连接到期望int
的Qt版本(例如QtGui.QSpinBox.setMaximum
)的插槽,您将看到相同的行为。除此之外,仅在Python端使用此信号应该没问题。
相关文章