PyQt5 随笔:信号与槽的两种连接方法:@pyqtSlot() 和 connect()
1. @pyqtSlot()
@pyqtSlot()
有两种使用情况。如下面两个例子。
例子1:一个信号时,如pushButton
的clicked
,即按钮的点击信号
# 需要引入 pyqtSlot 库函数
from PyQt5.QtCore import pyqtSlot
# 信号与槽函数
@pyqtSlot()
def on_pushButton_clicked(self):
print('点击了按钮')
代码说明:
@pyqtSlot()
是这种方式的修饰关键词,他表明下面函数是信号槽函数由于没有connect来初始化,在初始化函数中,没有说明是那个控件信号的关键词。
所以,在
@pyqtSlot()
方式里,函数名称有特殊要求
on_(控件对象名)_信号名(self,内置参数)
内置参数可以缺省
例子2:一个控件多个信号时,如名为self.lineEdit_2
的QlineEdit
控件的returnPressed
和textChanged
信号
@pyqtSlot()
def on_lineEdit_2_returnPressed(self):
print('触发了信号 returnPressed')
def on_lineEdit_2_textChanged(self):
print('触发了信号 textChanged')
代码说明:一个控件同时要写多个信号与槽函数时,只需要写一遍@pyqtSlot()
关键词,中间可以有其他函数隔开。
注意是一个控件只写一遍@pyqtSlot()
,不是所有控件信号只写一次@pyqtSlot()
,有多少控件的信号还是要写。
如果多个控件信号只写一次@pyqtSlot()
,有时会发生非常诡异的事情😄
注:完整的例子代码是在一个类中,所以有关键字self
。
2. connect()
同样,例子1:pushButton
的clicked
,即按钮的点击信号
# 在初始化函数中信号连接
self.pushButton.clicked.connect(self.A)
# 槽函数
def A(self):
print('点击了按钮')
代码说明:
由于信号的连接和槽函数是分开的,所以槽函数名称没有特殊要求。而信号连接语句有特殊要求
(控件名称).(信号名称).connect(槽函数名称)
有参数时,槽函数名称部分写成
lambda 参数名:函数名(参数名)
注意,没有参数时槽函数不用写双括号
()
一个控件多个信号时写法也一样。
。
3.对比
@pyqtSlot()
优点是方式书写比较简洁。缺点是但函数名称不能自由定义,在想自定义参数时没有详细说明。
connect()
方式优点是理解和学习起来比较简单,而且函数名称可以自由定义。缺点是但如果信号比较多时,书写就比较混乱。
。
。
。
。
。