在PYSIDE中,为什么在信号处理后发出一个整数>0x7FFFFFFFF会导致"Overflow Error"?

2022-05-05 00:00:00 python pyside signals qt

问题描述

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

解决方案

我主要是一名PYQT用户,但我相信他们的行为是相似的。信号定义中的int被映射到4字节整数(正如Qt对int的理解)。

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

class Communicate(QObject):
    speak = Signal(object)
但请注意,如果将此信号连接到期望int的Qt版本(例如QtGui.QSpinBox.setMaximum)的插槽,您将看到相同的行为。除此之外,仅在Python端使用此信号应该没问题。

相关文章