我正在尝试使用大整数范围为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 2147483647 Say -2147483648 OverflowError Say 2147483648
答案 0 :(得分:5)
我主要是PyQt用户,但我相信行为是类似的。信号定义中的int
映射到4字节整数(因为Qt理解int
)。
一种可能的解决方案是强制信号发出Python对象。这有效:
class Communicate(QObject):
speak = Signal(object)
但请注意,如果您将此信号连接到需要Qt版本int
的插槽(例如QtGui.QSpinBox.setMaximum
),您将看到相同的行为。除此之外,纯粹在Python方面使用这个信号应该没问题。