PyQtSignal中int类型的取值限制问题(非重复提问:存在完全无提示的静默错误)
PyQtSignal中int类型的取值限制问题(非重复提问:存在完全无提示的静默错误)
你遇到的这个完全静默的错误真的特别坑——明明代码看起来没问题,信号传参却悄咪咪出问题,连个报错都没有,排查起来头都大!
先给你理清楚问题根因:你定义的信号add_history_row_signal = QtCore.pyqtSignal(int, int)里的int对应的是C层面的int类型,而Python里id(my_object)返回的是一个64位的整数(尤其是64位系统上)。但C的int通常是32位的,取值范围在-2147483648到2147483647之间,一旦你的对象id超出这个范围,PyQt会直接把超出的部分截断,而且这个过程完全不会给你任何提示,导致接收方法拿到的是被截断后的错误数值,自然在字典里找不到对应键了。
给你两个靠谱的解决办法:
最推荐:直接传递对象而非id
把信号的参数类型改成object(对应PyQt里的PyQt_PyObject),这样可以直接传递Python对象,不用绕id的弯路,既安全又省心:add_history_row_signal = QtCore.pyqtSignal(object, int)发送信号的时候直接传
my_object,接收方法里要么直接用这个对象当字典的键(如果你的字典本来就以对象为键的话),要么再取id()也不会有截断问题。如果必须传id:改用64位整数类型
要是你非得传递id,那就把信号的第一个参数类型改成longlong(对应C++的64位整数,能容纳Python id的取值范围):add_history_row_signal = QtCore.pyqtSignal('longlong', int)这样传递的id就不会被截断,接收方法拿到的就是正确的数值了。
内容来源于stack exchange
相关产品推荐
相关产品推荐

