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 ...
随机推荐
- 4 urllib和urllib2的区别
4 urllib和urllib2的区别 这个面试官确实问过,当时答的urllib2可以Post而urllib不可以. urllib提供urlencode方法用来GET查询字符串的产生,而urllib2 ...
- .NET 5 和 C#9 /F#5 一起到来, 向实现 .NET 统一迈出了一大步
经过一年多的开发,Microsoft 于北京时间 11 月 11 日(星期三)发布了其 .NET 5软件开发平台,强调平台的统一,并引入了 C# 9 和 F# 5 编程语言,新平台朝着桌面.Web.移 ...
- 使用git处理github中提交有冲突的pull request
前言: 为什么要写这篇文章,因为前段时间有一个开源的github中的项目有一个朋友提交了一个pr看了下是帮忙优化了下代码(十分感谢这位网友).但是他提交的pr刚好和我的项目有许多的冲突导致无法自动合并 ...
- Pandas_VBA_数据筛选比较
Pandas与VBA筛选数据的比较 Author:Collin_PXY 需求: 将B列里值为Completed 和 Pending的A,B,D三列数据筛选出来,新建一个名为 Filited_data的 ...
- JS仿贪吃蛇:一串跟着鼠标的Div
贪吃蛇是一款80后.90后比较熟悉的经典游戏,下面通过简单的JS代码来实现低仿版贪吃蛇效果:随着鼠标的移动,在页面中呈现所有Div块跟随鼠标依次移动,效果如下图所示. <!DOCTYPE htm ...
- C#调用pyd
python打包成pyd在本篇博客不多叙述,请读者自行百度,本篇博客主要讲解在C#中如何调用pyd以及遇到的一些问题如何解决. 1.安装pythonnet pythonnet是一个强大的工具包,用于C ...
- leetcode 30day--2
202. Happy Number Write an algorithm to determine if a number n is "happy". A happy number ...
- MySQL慢查询开启、日志分析(转)
说明 Mysql的查询讯日志是Mysql提供的一种日志记录,它用来记录在Mysql中响应时间超过阈值的语句 具体指运行时间超过long_query_time值得SQL,则会被记录到慢查询日志中.lon ...
- TIME_WAIT状态存在的原因
TIME_WAIT状态存在有两个理由: 1.可靠地实现TCP全双工连接的中断 2.允许老的重复分节在网络中消失 第一个理由:如果客户端的ACK丢失了,服务器将会重新发送它的最终的那个FIN,因此客户端 ...
- fcntl函数用法——操纵文件描述符状态
fcntl函数:操纵文件描述符,改变已经打开的文件的属性int fcntl(int fd, int cmd, ... //arg );cmd选项:一.复制文件描述符:F_DUPFD二.更改设置文件描 ...