如何使用 PyQt 信号发出 64 位无符号整数

问题描述 投票:0回答:1

我过去在使用

PyQt5.QtCore.pyqtSignal(int)
时遇到了整数溢出问题,因为在C++调用中Python int似乎变成了C int(32位有符号整数)。这将信号可以发出的最大值限制为 2,147,483,647。

我通过发出

PyQt5.QtCore.pyqtSignal(object)
来解决这个问题,但我想这会给信号增加很多开销。

有没有办法准确指定我希望信号在 python 代码中发出哪种类型的整数?

python pyqt pyqt5 integer-overflow
1个回答
0
投票

当使用 PyQt 并处理信号槽机制时,尤其是大整数时,您遇到的问题确实是由于 Python 的

int
在使用
int
时被转换为 C++
pyqtSignal(int)
。由于 C++ 中的 32 位有符号整数限制,此转换限制了整数大小。

使用

pyqtSignal(object)
是一种解决方法,因为它允许通过信号传输 Python 对象(包括 Python 的无限大小
int
)。然而,正如您正确指出的那样,由于 Python 对象的动态特性,这可能会增加开销。

要指定整数的确切类型,您可以将

QtCore.pyqtSignal
与 PyQt 提供的特定 C++ 整数类型一起使用。这些类型包括用于 32 位和 64 位整数(有符号和无符号)的
quint32
qint64
quint64
。以下是如何使用它们:

  1. 对于 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)
    
  2. 对于 64 位无符号整数: 如果您需要无符号 64 位整数,请使用

    QtCore.pyqtSignal('quint64')
    ,该整数允许的值最大为 18,446,744,073,709,551,615。

    mySignal = pyqtSignal('quint64')
    

通过指定这些类型的信号,您可以避免使用

object
的开销,并且仍然拥有比默认 32 位范围更大的整数值范围。它在传递的数据类型方面也更加精确,这在 Python 和 Qt 开发中通常都是很好的实践。

记住在连接到它们的槽中适当地处理这些信号,确保槽函数与信号的数据类型兼容。

© www.soinside.com 2019 - 2024. All rights reserved.