最近在用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,具体最大是多少,还不知道,有机会可以写个循环找,哈哈哈,如果你找到了,记得告诉我!