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不能支持函数或方法重载,后定义的函数或方法会覆盖前面定义的,对这种重载只能用特殊方法解决:

  1. 由于Python中没有强制类型检查,对于参数个数相同但参数类型不同的信号,可以使用同一个槽函数,本例就是这种情况。对于需要区分参数类型进行不同处理的槽函数,在函数中再判断类型来确认处理方式,如上面的槽函数就输出了参数类型;
  2. 对于信号个数不同的方式,可以按最多的个数传递参数,参数少的可以通过缺省值方式来处理,在槽函数中判断参数是否缺省值来区分不同的处理逻辑;
  3. 对于信号个数不同的方式,应该还可以按可变不定数量的参数的模式来解决(关于可变参数的处理请参考《第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)是什么?的更多相关文章

  1. PyQt(Python+Qt)学习随笔:Designer中QDialogButtonBox确认clicked信号是哪个按钮发送的方法

    一.引言 QDialogButtonBox本身只提供4种信号,分别是accepted.rejected.clicked和helpRequested,在<PyQt(Python+Qt)学习随笔:D ...

  2. PyQt(Python+Qt)学习随笔:Designer中的QDialogButtonBox的clicked信号参数QAbstractButton *解决办法

    一.引言 QDialogButtonBox本身只提供4种信号,分别是accepted.rejected.clicked和helpRequested,在<PyQt(Python+Qt)学习随笔:D ...

  3. PyQt(Python+Qt)学习随笔:利用QWidget部件的palette以及ColorGroup、colorRole局部调整部件的特定范围颜色

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 在<PyQt(Python+Qt)学习随笔:QWidget部件的 ...

  4. PyQt(Python+Qt)学习随笔:视图中类QAbstractItemView的dragDropOverwriteMode属性不能覆盖写的问题

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在<PyQt(Python+Qt)学习随笔:视图中类QAbstractItemView的dra ...

  5. PyQt(Python+Qt)学习随笔:视图中类QAbstractItemView的dragDropOverwriteMode属性

    老猿Python博文目录 老猿Python博客地址 一.属性的作用 dragDropOverwriteMode属性用于控制视图的拖放行为,如果其值为True,则视图中选定的数据将在拖拽数据放下时被覆盖 ...

  6. PyQt(Python+Qt)学习随笔:视图中的dragDropMode属性对dragEnabled和acceptDrops属性的影响

    老猿Python博文目录 老猿Python博客地址 在<PyQt(Python+Qt)学习随笔:QAbstractItemView的dragEnabled和dragDropMode属性的关系&g ...

  7. PyQt(Python+Qt)学习随笔:QAbstractItemView的dragEnabled和dragDropMode属性的关系

    老猿Python博文目录 老猿Python博客地址 在<PyQt(Python+Qt)学习随笔:QAbstractItemView的dragEnabled属性的困惑>中,老猿觉得dragE ...

  8. PyQt(Python+Qt)学习随笔:视图中的拖放操作注意事项

    老猿Python博文目录 老猿Python博客地址 在通过PyQt构建的图形界面中进行拖放,要成功进行拖放需要注意: 视图相关属性需要支持拖放,具体相关属性请参考<PyQt(Python+Qt) ...

  9. PyQt(Python+Qt)学习随笔:Qt Designer中部件的autoFillBackground属性

    autoFillBackground属性可以确认部件背景是否自动填充,如果自动填充,Qt会在调用Paint事件之前填充部件的背景.使用的颜色由部件调色板中的QPalette.window 角色定义(关 ...

  10. PyQt(Python+Qt)学习随笔:Qt Designer中部件的accessibleDescription和accessibleName辅助阅读属性

    accessibleDescription和accessibleName属性都是用于残疾人辅助阅读的,这两个属性都有国际化属性(关于国际化请参考<PyQt(Python+Qt)学习随笔:Qt D ...

随机推荐

  1. python爬虫00什么是爬虫

    用一个自动化的程序把网站背后的程序爬取下来. 在互联网上许许多多的网站,他们都是托管在服务器上的,这些服务器24小时运行着,刻刻 等待着别人的请求.所以,爬虫首先会模拟请求,就好像你在浏览器输入网址, ...

  2. CentOS6.x 安装 nginx-1.19.4

    1.下载nginx http://nginx.org/en/download.html wget  http://nginx.org/download/nginx-1.19.4.tar.gz 2.解压 ...

  3. HTML图片点击放大---关闭

    <html lang="en"> <head> <meta charset="UTF-8"> </head> & ...

  4. php xml转数组

    <?php libxml_disable_entity_loader(true); $notify_values = json_decode(json_encode(simplexml_load ...

  5. StringUtil字符串工具-功能扩展

    对java的String类的一些小补充. public class StringUtil { /** 将一个字符串的首字母大写然后返回. @param str 要处理的目标字符串. @return S ...

  6. Node.js 搞Javascript开发的无论如何要尝试一下

    我想找个因子给大家介绍Node.js 这样吧,我想Jquery的占有率那么高,就拿Jquery来说吧. https://github.com/jquery/jquery 首先打开Jquery的gith ...

  7. JAVA中常见的阻塞队列详解

    在之前的线程池的介绍中我们看到了很多阻塞队列,这篇文章我们主要来说说阻塞队列的事. 阻塞队列也就是 BlockingQueue ,这个类是一个接 口,同时继承了 Queue 接口,这两个接口都是在JD ...

  8. 6. Spark SQL和Beeline

    *以下内容由<Spark快速大数据分析>整理所得. 读书笔记的第六部分是讲的是Spark SQL和Beeline. Spark SQL是Spark用来操作结构化和半结构化数据的接口. 一. ...

  9. 我画着图,FluentAPI 她自己就生成了

    在 Newbe.ObjectVistor 0.3 版本中我们非常兴奋的引入了一个紧张刺激的新特性:使用状态图来生成任意给定的 FluentAPI 设计. 开篇摘要 在非常多优秀的框架中都存在一部分 F ...

  10. linux tcp Nagle算法,TCP_NODELAY和TCP_CORK 转载

    转载自: http://www.cnhalo.net/2016/08/13/linux-tcp-nagle-cork/ http://abcdxyzk.github.io/blog/2018/07/0 ...