我过去在使用
PyQt5.QtCore.pyqtSignal(int)
时遇到了整数溢出问题,因为在C++调用中Python int似乎变成了C int(32位有符号整数)。这将信号可以发出的最大值限制为 2,147,483,647。
我通过发出
PyQt5.QtCore.pyqtSignal(object)
来解决这个问题,但我想这会给信号增加很多开销。
有没有办法准确指定我希望信号在 python 代码中发出哪种类型的整数?
当使用 PyQt 并处理信号槽机制时,尤其是大整数时,您遇到的问题确实是由于 Python 的
int
在使用 int
时被转换为 C++ pyqtSignal(int)
。由于 C++ 中的 32 位有符号整数限制,此转换限制了整数大小。
使用
pyqtSignal(object)
是一种解决方法,因为它允许通过信号传输 Python 对象(包括 Python 的无限大小 int
)。然而,正如您正确指出的那样,由于 Python 对象的动态特性,这可能会增加开销。
要指定整数的确切类型,您可以将
QtCore.pyqtSignal
与 PyQt 提供的特定 C++ 整数类型一起使用。这些类型包括用于 32 位和 64 位整数(有符号和无符号)的 quint32
、qint64
和 quint64
。以下是如何使用它们:
对于 64 位有符号整数: 使用
QtCore.pyqtSignal('qint64')
创建可以处理 64 位有符号整数的信号。这会将限制增加到 ±9,223,372,036,854,775,807。
from PyQt5.QtCore import pyqtSignal, QObject
class MyEmitter(QObject):
mySignal = pyqtSignal('qint64')
def emit_signal(self, value):
self.mySignal.emit(value)
对于 64 位无符号整数: 如果您需要无符号 64 位整数,请使用
QtCore.pyqtSignal('quint64')
,该整数允许的值最大为 18,446,744,073,709,551,615。
mySignal = pyqtSignal('quint64')
通过指定这些类型的信号,您可以避免使用
object
的开销,并且仍然拥有比默认 32 位范围更大的整数值范围。它在传递的数据类型方面也更加精确,这在 Python 和 Qt 开发中通常都是很好的实践。
记住在连接到它们的槽中适当地处理这些信号,确保槽函数与信号的数据类型兼容。