PyQt5学习随笔4——信号与槽

本文详细介绍了Qt/PyQt中的信号与槽机制,包括基本概念、如何绑定和测试信号与槽,以及如何自定义信号和处理多个信号。示例展示了如何设置按键关闭窗口,并提供了自定义信号类的实现,演示了信号触发和断开连接的过程。此外,还展示了如何为类添加多个信号并分别处理不同的参数类型。

视频网址:课时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()

最后结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值