视频网址:课时22
https://www.bilibili.com/video/BV154411n79k?p=21
一、基础定义
信号(signal)与槽(slot)是Qt/PyQt的核心机制。
信号:由对象或者控件发送出去的消息;可以理解为事件;
槽:本质上是一个函数或者方法,拦截发送出去的信号;可以理解为事件函数;
信号和槽需要绑定,一个信号可以和多个槽绑定,一个槽可以拦截多个信号。(多对多)
示例:设置按键关闭窗口
工具栏选择**“窗体”–“预览”**,可以测试效果
工具栏选择**“edit”–“编辑信号与槽”,从信号发射的控件拖拽到空白区域或者接收信号的控件**,可以链接起信号与槽。链接完毕后,选择**“edit”–“编辑窗口部件”**,再点击预览,则可以测试效果。
- 信号与槽的选择与功能
左边栏:
| 名称 | 功能 |
|:--------😐—|
| clicked() | 单击 |
| toggled(bool) | 选中/未选中 |
右边栏:
名称 | 功能 |
---|---|
setVisible(bool) | 控制显示与隐藏 |
setEnabled(bool) | 可用不可用 |
二、自定义信号
pyqtSingnal()
from PyQt5.QtCore import *
class MyTypeSignal(QObject):
#定义一个信号
sendmsg = pyqtSignal(object)
#触发
def run(self):
self.sendmsg.emit('hello')
class MySlot(QObject):
# 设置槽 get
def get(self,msg):
print ("信息:" + smg)
if __name__ == '__main__'
send = MyTypeSignal()
slot = MySlot()
#绑定到槽上
send.sendmsg.connect(slot.get)
send.run()
运行后可以得到结果:
如果需要将信号和槽断开:
send.sendmsg.disconnect(slot.get)
三、为类添加多个信号
from PyQt5.QtCore import *
class MultiSignal(QObject):
signal1 = pyqtSignal()
signal2 = pyqtSignal(int)
signal3 = pyqtSignal(int,str)
signal4 = pyqtSignal(list)
signal5 = pyqtSignal(dict)
#声明一个重载版本的信号,即槽函数的参数可以是int和str,也可以只有一个str,默认关联到第一个上
signal6 = pyqtSignal([int,str],[str])
def __init__(self):
super(MultiSignal,self).__init__()
self.signal1.connect(self.signalCall1)
self.signal2.connect(self.signalCall2)
self.signal3.connect(self.signalCall3)
self.signal4.connect(self.signalCall4)
self.signal5.connect(self.signalCall5)
#指定关联
#self.signal6[str].connect(self.signalCall6Overload)
#self.signal6[int,str].connect(self.signalCall6)
#通过emit触发,传递参数
self.signal1.emit()
self.signal2.emit(10)
self.signal3.emit(1,"hello")
self.signal4.emit([1,2,3,4,5,6])
self.signal5.emit({"name":"bill","age":30})
self.signal6[str].emit("test")
self.signal6[int,str].emit(20,"mytest")
def __init__(self):
super(MultiSignal,self).__init__()
def signalCall1(self):
print("signal1 emit")
def signalCall2(self,val):
print("signal2 emit,value:", val)
def signalCall3(self,val,text):
print("signal3 emit,value:", val, text)
def signalCall4(self,val):
print("signal4 emit,value:", val)
def signalCall5(self,val):
print("signal5 emit,value:", val)
def signalCall6(self,val,text):
print("signal6,value:", val, text)
def signalCall6overload(self,val):
print("signal6 overload emit,value:", val)
if __name__ == '__main__':
multiSignal = MultiSignal()
最后结果: