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

In Pyside, why does emiting an integer gt; 0x7FFFFFFF result in quot;OverflowErrorquot; after the signal is processed?(在PYSIDE中,为什么在信号处理后发出一个整数gt;0x7FFFFFFFF会导致quot;Overflow Errorquot;?)
本文介绍了在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
  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端使用此信号应该没问题。

这篇关于在PYSIDE中,为什么在信号处理后发出一个整数>0x7FFFFFFFF会导致"Overflow Error"?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Leetcode 234: Palindrome LinkedList(Leetcode 234:回文链接列表)
How do I read an Excel file directly from Dropbox#39;s API using pandas.read_excel()?(如何使用PANDAS.READ_EXCEL()直接从Dropbox的API读取Excel文件?)
subprocess.Popen tries to write to nonexistent pipe(子进程。打开尝试写入不存在的管道)
I want to realize Popen-code from Windows to Linux:(我想实现从Windows到Linux的POpen-code:)
Reading stdout from a subprocess in real time(实时读取子进程中的标准输出)
How to call type safely on a random file in Python?(如何在Python中安全地调用随机文件上的类型?)