PyQt(Python+Qt)学习随笔:信号签名(signature of the signal)是什么?
1、概念解释
函数签名:由函数的参数个数与其类型组成。函数在重载时,利用函数签名的不同即参数个数与类型的不同来区别调用者到底调用的是哪个函数。
信号签名:信号携带的参数称为信号签名,因为信号本质上是函数、槽是回调函数,所以用C++的函数签名来称信号的参数为信号签名。
信号定义:定义信号的本质就是在类体中使用QtCore.pyqtSignal定义一个类变量,QtCore.pyqtSignal的完整语法如下:
PyQt5.QtCore.pyqtSignal(types[, name[, revision=0[, arguments=[]]]])
其中的types参数就是信号的参数,定义信号的C++签名的类型,每种类型都可以是Python类型对象,也可以是一个C++类型的字符串,在这里先理解为信号签名支持多个参数时,在这个参数中通过逗号分隔传递这些参数的类型,如types 值为“str,int,str”(双引号只是为了标记这三个类型,在签名中是要去掉的)表示信号有三个参数,类型分别是str、int、str。
除了上述模式的参数,types参数还支持每一个都可以是一个序列(如列表)类型参数,在这种情况下,每个序列定义不同信号重载的签名,即同一个信号名有不同签名(即信号名相同、签名不同的重载信号),每个签名是一序列类型,第一个序列将是重载方法调用的缺省签名。
2、信号签名举例
2.1、案例1: 一个信号带两个参数
- 信号定义
sig1 = QtCore.pyqtSignal(int,str) #信号定义,"int,str"为信号签名
- 信号槽定义
def sigRecv(self,val1,val2): #接收信号的槽函数
self.w_displayInf.append(f"Received sinal:{val1},{val2},type:{type(val1),type(val2)}")
- 信号槽连接
self.connection1 = self.sig1[int,str].connect(self.sigRecv) #连接信号和槽
在这种信号定义模式下,信号没有重载,信号签名可以省略,改成如下也可以
self.connection1 = self.sig1.connect(self.sigRecv) #省略签名连接信号和槽
- 信号发送
self.sig1[int,str].emit(self.count,info) #信号带签名发送
也可以信号不带签名发送,在信号未重载情况下效果是一样的。
- 信号槽断开连接
#下列代码在信号没有重载情况下是等价的,如果信号有重载必须带签名
self.sig1.disconnect(self.sigRecv) #不带签名断开
self.sig1[int,str].disconnect(self.sigRecv) #带签名断开
self.sig1[int,str].disconnect(self.sigRecv) #带签名断开
self.sig1[int,str].disconnect(self.connection1) #通过连接带签名断开
self.sig1.disconnect(self.connection1) #通过连接不带签名断开
2.2、 案例2:一个信号重载带两组不同的参数
- 信号定义
sig1 = QtCore.pyqtSignal([int,str],[str,int])
上面的信号定义参数types就是两个序列(列表),表示该信号支持重载,有2种不同的信号签名,在此特地用了签名中参数的类型是进行了一下交换,更能体现签名的作用,即签名与参数个数、参数类型、参数顺序都相关。
- 信号槽定义
def sigRecv(self,val1,val2): #接收信号的槽函数
self.w_displayInf.append(f"Received sinal:{val1},{val2},type:{type(val1),type(val2)}")
由于信号重载,槽方法肯定也只能重载,但Python不能支持函数或方法重载,后定义的函数或方法会覆盖前面定义的,对这种重载只能用特殊方法解决:
- 由于Python中没有强制类型检查,对于参数个数相同但参数类型不同的信号,可以使用同一个槽函数,本例就是这种情况。对于需要区分参数类型进行不同处理的槽函数,在函数中再判断类型来确认处理方式,如上面的槽函数就输出了参数类型;
- 对于信号个数不同的方式,可以按最多的个数传递参数,参数少的可以通过缺省值方式来处理,在槽函数中判断参数是否缺省值来区分不同的处理逻辑;
- 对于信号个数不同的方式,应该还可以按可变不定数量的参数的模式来解决(关于可变参数的处理请参考《第5.2节 Python中带星号的函数参数实现参数收集》),不过老猿没有验证,有兴趣的读者可以试一下。
- 信号槽连接
self.connection1 = self.sig1.connect(self.sigRecv) #信号不带签名连接信号和槽
self.connection2 = self.sig1[str,int].connect(self.sigRecv)#信号带签名连接信号和槽
在这种信号定义模式下,信号重载,连接时信号签名也可以省略,不过省略后默认使用信号定义的第一个签名即[int,str],对第二个签名的信号必须使用带签名的信号进行连接。
- 信号发送
self.sig1[int,str].emit(self.count,info) #信号带签名1发送
self.sig1.emit(self.count, info) #信号不带签名发送,效果与带签名1发送相同
self.sig1[str, int].emit(info,self.count)#信号带签名2发送
self.sig1[str,int].emit(self.count, info) #信号带签名2发送,但发送参数为签名1对应参数引发异常
self.sig1.emit(info,self.count) #信号不带签名发送,发送参数为签名2对应参数引发异常
上面五个语句最后两个执行都会有异常,提示发送参数类型错误。
- 信号槽断开连接
self.sig1.disconnect() #断开self.sig1第一个签名匹配的所有槽,
self.sig1[str,int].disconnect() #断开self.sig1签名为“str,int”匹配的所有槽
self.sig1.disconnect(self.connection1) #通过连接不带签名断开

老猿Python,跟老猿学Python!
PyQt(Python+Qt)学习随笔:信号签名(signature of the signal)是什么?的更多相关文章
- PyQt(Python+Qt)学习随笔:Designer中QDialogButtonBox确认clicked信号是哪个按钮发送的方法
一.引言 QDialogButtonBox本身只提供4种信号,分别是accepted.rejected.clicked和helpRequested,在<PyQt(Python+Qt)学习随笔:D ...
- PyQt(Python+Qt)学习随笔:Designer中的QDialogButtonBox的clicked信号参数QAbstractButton *解决办法
一.引言 QDialogButtonBox本身只提供4种信号,分别是accepted.rejected.clicked和helpRequested,在<PyQt(Python+Qt)学习随笔:D ...
- PyQt(Python+Qt)学习随笔:利用QWidget部件的palette以及ColorGroup、colorRole局部调整部件的特定范围颜色
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 在<PyQt(Python+Qt)学习随笔:QWidget部件的 ...
- PyQt(Python+Qt)学习随笔:视图中类QAbstractItemView的dragDropOverwriteMode属性不能覆盖写的问题
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在<PyQt(Python+Qt)学习随笔:视图中类QAbstractItemView的dra ...
- PyQt(Python+Qt)学习随笔:视图中类QAbstractItemView的dragDropOverwriteMode属性
老猿Python博文目录 老猿Python博客地址 一.属性的作用 dragDropOverwriteMode属性用于控制视图的拖放行为,如果其值为True,则视图中选定的数据将在拖拽数据放下时被覆盖 ...
- PyQt(Python+Qt)学习随笔:视图中的dragDropMode属性对dragEnabled和acceptDrops属性的影响
老猿Python博文目录 老猿Python博客地址 在<PyQt(Python+Qt)学习随笔:QAbstractItemView的dragEnabled和dragDropMode属性的关系&g ...
- PyQt(Python+Qt)学习随笔:QAbstractItemView的dragEnabled和dragDropMode属性的关系
老猿Python博文目录 老猿Python博客地址 在<PyQt(Python+Qt)学习随笔:QAbstractItemView的dragEnabled属性的困惑>中,老猿觉得dragE ...
- PyQt(Python+Qt)学习随笔:视图中的拖放操作注意事项
老猿Python博文目录 老猿Python博客地址 在通过PyQt构建的图形界面中进行拖放,要成功进行拖放需要注意: 视图相关属性需要支持拖放,具体相关属性请参考<PyQt(Python+Qt) ...
- PyQt(Python+Qt)学习随笔:Qt Designer中部件的autoFillBackground属性
autoFillBackground属性可以确认部件背景是否自动填充,如果自动填充,Qt会在调用Paint事件之前填充部件的背景.使用的颜色由部件调色板中的QPalette.window 角色定义(关 ...
- PyQt(Python+Qt)学习随笔:Qt Designer中部件的accessibleDescription和accessibleName辅助阅读属性
accessibleDescription和accessibleName属性都是用于残疾人辅助阅读的,这两个属性都有国际化属性(关于国际化请参考<PyQt(Python+Qt)学习随笔:Qt D ...
随机推荐
- LDA与PCA
参考: https://www.cnblogs.com/pinard/p/6244265.html https://blog.csdn.net/qq_25680531/article/details/ ...
- 小程序·云开发地表最强CI利器来了
小程序CI 与 CloudBase-FrameWork 从2017年开始,微信小程序的能力也随着前端的大发展的趋势越来越多,包体积限制越来越宽松,大型微信小程序的开发团队越来越多,为了适应形式,微信小 ...
- C#高级编程之反射
反射的定义 MSDN定义:反射提供描述程序集.模块和类型的对象(Type类型). 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型,然后调用其方法或访问器字段和属性. 如 ...
- Springboot 完整搭建快速入门,必看!
前言 手把手教你Springboot微服务项目搭建快速入门,通过本文学习Springboot的搭建快速入门,掌握微服务大致的配置服务,后续将会继续将核心组件引入到项目中,欢迎关注,点赞,转发. Spr ...
- HBase高级特性、rowkey设计以及热点问题处理
在阐述HBase高级特性和热点问题处理前,首先回顾一下HBase的特点:分布式.列存储.支持实时读写.存储的数据类型都是字节数组byte[],主要用来处理结构化和半结构化数据,底层数据存储基于hdfs ...
- 在linux系统中通过fw_printenv查看和设置u-boot中的环境变量
uboot下可以通过命令访问(printenv)和修改环境变量(setenv),但是如果需要在Linux系统下访问这些数据该怎么办呢?其实uboot早就帮我们想好了. 1.编译fw_printenv ...
- 使用Folx下载热门电影居然这么简单
在闲暇的时候,很多人会选择观看电影.电视剧来打发时间.对于一些热门的资源,可以通过网页搜索的方式,找到很多与之相对应的种子资源. 但有时候,一些不那么热门的资源就要花费较多时间搜索.有了Folx bt ...
- Guitar Pro7应该怎么添加音色
众所周知,音色是乐器的灵魂所在.音色的好坏,直接影响到了整首曲子的质量.Guitar Pro7中,用户不仅可以切换乐器模拟器,还能分别对其进行音色调整.对于新手而言,Guitar Pro7是一款非常合 ...
- JavaScript中的链式调用
链模式 链模式是一种链式调用的方式,准确来说不属于通常定义的设计模式范畴,但链式调用是一种非常有用的代码构建技巧. 描述 链式调用在JavaScript语言中很常见,如jQuery.Promise等, ...
- 【CF620E】New Year Tree
(题面来自luogu) 题意翻译 你有一棵以1为根的有根树,有n个点,每个节点初始有一个颜色c[i]. 有两种操作: 1 v c 将以v为根的子树中所有点颜色更改为c 2 v 查询以v为根的子树中的节 ...