记PyQt5信号的一个坑

最近在用PyQt5做项目的时候偶然发现了一个小BUG,BUG虽小,可有时候往往就是最致命的一击。这里分享一下,希望大家不要踩坑。先看下面一个例子:
 

# -*- coding: utf-8 -*-
from PyQt5.QtWidgets import QWidget,QHBoxLayout,QLabel,QPushButton,QApplication,QVBoxLayout
from PyQt5.QtCore import  pyqtSignal
from functools import  partial

class test_PyQt_Bug(QWidget):
    long_int_signal = pyqtSignal(int)
    def __init__(self):
        super(test_PyQt_Bug, self).__init__()
        self.setGeometry(600,300,500,500)
        self.ini_ui()

    def ini_ui(self):
        main_layout = QHBoxLayout()
        main_layout.setSpacing(100)
        btn_layout = QVBoxLayout()
        btn_layout.setSpacing(50)
        self.send_btn = QPushButton("发送按钮1")
        self.send_btn.setObjectName("send_btn")
        self.send_btn2 = QPushButton("发送按钮2")
        self.send_btn2.setObjectName("send_btn2")
        btn_layout.addWidget(self.send_btn)
        btn_layout.addWidget(self.send_btn2)
        self.number_label = QLabel()
        main_layout.addLayout(btn_layout)
        main_layout.addWidget(self.number_label)
        self.setLayout(main_layout)

        #按钮信号发送
        self.send_btn.clicked.connect(self.send_btn_slot)
        self.send_btn.clicked.connect(partial(self.show_number_slot,id(self.send_btn)))

        #普通信号发送
        self.long_int_signal.connect(self.show_number_slot)
        self.send_btn2.clicked.connect(self.send_btn2_slot)

    def send_btn_slot(self):
        self.signal_sender = "按钮1内置信号"

    def send_btn2_slot(self):
        self.signal_sender = "PyQt5普通信号"
        self.long_int_signal.emit(id(self.send_btn))

    def show_number_slot(self,number):
        sender = self.signal_sender
        number1 = id(self.send_btn)
        number2 = number
        self.number_label.setText("发送人:{} \n\n正确的数字是: {}\n\n接收到的数字是: {}".format(sender,number1,number2))


if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    test_win = test_PyQt_Bug()
    test_win.show()
    sys.exit(app.exec_())

运行结果

图像无法显示

图像无法显示

可以看到,同样是发送一长串的整数,PyQt5内置的按钮信号工作正常,而我们自定义的整型数字信号却把数字改了,说明数据在传输的过程中受到了修改,严重影响数据安全,所以要慎用这样的写法,目前原因我没有找到,因为理论上,Python中的整型数据类型是没有大小限制的,这应该是PyQt的问题,知道的朋友可以在下面留言。

为了找到能正确传输的最大数字大小范围,我还用下面这几个数字多做了几次实验:

  • 123456789
  • 1234567891
  • 12345678910
  • 2222222222

运行结果如下:

无无无

发现整型信号正确传输的最大位数不能超过10位数,而且不能大于2222222222,具体最大是多少,还不知道,有机会可以写个循环找,哈哈哈,如果你找到了,记得告诉我!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

daimashiren

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值