1.是什么
其实这个机制非常好理解,我们拿红绿灯来做个类比。
当红灯信号发射后,行人就会停下;当绿灯信号发射后,行人就会前进。我们用red和green来表示信号,用stop()和go()函数来表示行人的动作,这两个函数也被称为槽函数。
也就是说,当red信号发射后,stop()槽函数就会被调用;当green信号发射后,go()槽函数会被调用。不过信号和槽只有在连接之后才可以起作用,连接方式如图1-21所示
在下图中
(1)widget就是PyQt中的控件对象。其实就是组件
(2)signal就是控件对象拥有的信号
(3)connect()方法用于连接信号和槽,
(4)slot是槽函数名称。
red信号和stop()槽函数进行连接
green信号和go()槽函数进行连接
只有这样连接后,发射的信号才可以调用相应的槽函数。
总结起来就一句话:连接后,信号发射,槽函数“启动”
traffic_light.red.connect(stop)
traffic_light.green.connect(go)
在connect()方法中传入的是函数名
2.一个信号连接一个槽
1.案例一:start按钮与stop按钮之间转换
实现功能:我们可以在很多窗口上看到“Start”按钮,单击之后文本从“Start”变成了“Stop”
import sys
from PyQt5.QtWidgets import *
class Window(QWidget):
def __init__(self):
super(Window, self).__init__()
btn = QPushButton('Start', self)
btn.clicked.connect(self.change_text)
def change_text(self):
btn = self.sender()
if btn.text() == 'Start':
btn.setText('Stop')
else:
btn.setText('Start')
if __name__ == '__main__':
app = QApplication([])
window = Window()
window.show()
sys.exit(app.exec())
(#1) 实例化一个QPushButton按钮控件之后,我们将按钮的clicked信号与自定义的change_text()槽函数连接起来。
(#2) 在槽函数中,我们首先通过text()方法获取到当前单击按钮的文本,如果是“Start”,就调用setText()方法将按钮的文本修改为“Stop”。而如果文本是“Stop”,就将其修改为“Start”。
因为要在槽函数中使用btn对象,所以应该在类的初始化函数__init__()中将btn设置为成员变量,也就是self.btn。当然我们也可以直接通过sender()方法获取到当前发射信号的控件对象
每个控件都有相应的内置信号,比如QPushButton控件有clicked、pressed、released等内置信号。当然我们也可以给控件或窗口自定义一个信号
2.案例二:信号传值
信号是可以传值的,比如QLineEdit控件有一个textChanged信号,它会在输入框中的文本发生改变时被发射,并且会携带当前的文本。
import sys
from PyQt5.QtWidgets import *
class Window(QWidget):
def __init__(self):
super(Window, self).__init__()
self.resize(180