在Pyside中,为什么发出整数> 0x7FFFFFFF在处理信号后导致“OverflowError”?

时间:2012-05-26 00:48:46

标签: python qt signals pyside

我正在尝试使用大整数范围为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
  1. 为什么Qt似乎将整数类型的信号/槽视为处理有符号的32位整数而不是python内置的int?
  2. 如果这是Qt的限制,我该怎么做才能将int标记为无符号或确保QT可以处理整数> 0x7FFFFFFF的?

1 个答案:

答案 0 :(得分:5)

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

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

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

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