PyQt5:使用自定义信号时 int 对象的错误转换
PyQt5: Wrong conversion of int object when using custom signal
我正在尝试创建自定义pyqtSignal
以传递一些整数,但是我遇到了一些问题。让我首先举一个最小的例子来演示这个问题:
#!/usr/local/bin/python3
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys
class Form(QDialog):
post_request = pyqtSignal(int)
def __init__(self, parent=None):
super(Form, self).__init__(parent)
self.button = QPushButton('Click Me')
self.textbox = QLineEdit(self)
layout = QHBoxLayout()
layout.addWidget(self.button)
layout.addWidget(self.textbox)
self.setLayout(layout)
self.button.clicked.connect(self.on_button_click)
self.post_request.connect(self.test)
self.setWindowTitle('Test')
def on_button_click(self):
try:
integer = int(self.textbox.text(), 16)
self.post_request.emit(integer)
except ValueError:
print('wrong input')
def test(self, integer):
print('I received {0:x}'.format(integer))
def run_app():
app = QApplication(sys.argv)
form = Form()
form.show()
app.exec_()
if __name__ == '__main__':
run_app()
这是一个简单的窗口,可以打印出您在文本框中输入的任何内容(除非它是非十六进制字符)。现在,这在大多数情况下都工作正常。但是,当我在文本框中键入设置了最高有效位的数字时,它表现出一些奇怪的行为。例如,如果我在文本框中输入0x4afecafe
,然后单击按钮,它将打印:
我收到了 4afecafe
但是输入0xcafecafe
将导致以下输出:
我收到了-35013502
如果那是C/C++,这并没有错,但是在Python中,这破坏了我的程序,因为-35013502 == 0xcafecafe
返回False
。
所以我的问题是:
- 为什么会这样?我想这与 Python 包装器的底层实现有关,但我不太理解它。
- 如何解决此问题?我希望插槽接收一个 Python
int
对象,其中包含0xcafecafe
。
发送信号时,PyQt 将始终尽可能尝试转换为相应的C++类型。但是在它不能的地方,它只会发送一个指向 Python 对象的指针。因此,解决问题的最简单方法是不声明信号参数的特定类型,如下所示:
class Form(QDialog):
post_request = pyqtSignal(object)
现在 PyQt 不会尝试在 Python 和 C++ 类型之间进行转换。这是利用 Python 类型的默认行为,例如tuple
在C++中没有等效项。
相关文章:
- 在c++中访问int到类对象的映射时出错
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 包装一个对象并假装它是一个 int
- 类型为 'std::map< char,int > 的 <Swig 对象的代理
- 返回对象时从'const DList<int>* const'到 'DList<int>*' [-fallowive] 的转换无效
- 类对象在 int main() 中'undefined'
- 如果类对象需要在 C++ 中转换为 int,为什么会调用 "operator bool()"?
- 为什么 int 对象和函数类型之间不明确?
- switch 语句和对象隐式 int 转换
- 如何从 pair<int、对象的向量中删除重复项>
- 对类似"struct {double, int}"对象使用reinterpret_cast进行对象访问
- 重载 + 运算符以使用 int 添加对象
- 如何在C 2D向量中找到对象(而不是int)的位置
- 如何掩盖对象数组的数据类型字符串到C 中的INT
- jfieldid int对对象无效
- 在 c++ 中声明 int 对象
- 根据C++标准,int 变量是对象吗?
- 声明 Windows API 结构 (DCB) 的对象 - 错误 C4430:缺少类型说明符 - 假定为 int
- 如何使用 Android NDK 创建 Java 对象(int[])
- 拔河:将一组n个对象int划分为多个子集