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 ...
随机推荐
- ashx接收前台传来的数据
前台js: $(function () { $.ajax({ url: "/TestAshx/GetJson.ashx", type: "post", data ...
- 准备数据集用于flink学习
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- windows鼠标右键文件太多
1.网上找的(已经验证太难找,并没有多大用) 单击Windows的"开始"菜单,单击"运行",在"打开"框中键入"regedit& ...
- yum针对软件包操作的常用命令
yum针对软件包操作的常用命令: 1.使用YUM查找软件包 命令:yum search php 2.列出所有可安装的软件包 命令:yum list php 3.列出所有可更新的软件包 命令:yum l ...
- BlockingQueue中 take、offer、put、add的一些比较
(转自:https://blog.csdn.net/wei_ya_wen/article/details/19344939 侵删) 在java多线程操作中, BlockingQueue<E> ...
- 处理ceph incompelete的经验
前言 最近已经见到几个环境出现过incompelete了,这个在很久以前Jewel正在合入mark-complete工具的时候就有做过类似的处理,但是随着处理的环境越来越多,这个地方还是有些需要注意的 ...
- ThreadPoolExecutor源码分析-面试问烂了的Java线程池执行流程,如果要问你具体的执行细节,你还会吗?
Java版本:8u261. 对于Java中的线程池,面试问的最多的就是线程池中各个参数的含义,又或者是线程池执行的流程,彷佛这已成为了固定的模式与套路.但是假如我是面试官,现在我想问一些更细致的问题, ...
- ASP.NET Core使用HostingStartup增强启动操作
概念 在ASP.NET Core中我们可以使用一种机制来增强启动时的操作,它就是HostingStartup.如何叫"增强"操作,相信了解过AOP概念的同学应该都非常的熟悉.我们常 ...
- python-网络安全编程第一天(requests模块)
前言 感觉现在做好多CTF题都需要python去写工具,正好期末考试放假利用空余时间来学学. requests简介 Requests是用python语言基于urllib编写的,采用的是Apache2 ...
- 面试阿里,字节跳动99%会被问到的java线程和线程池,看完这篇你就懂了!
前言: 最近也是在后台收到很多小伙伴私信问我线程和线程池这一块的问题,说自己在面试的时候老是被问到这一块的问题,被问的很头疼.前几天看到后帮几个小伙伴解决了问题,但是问的人有点多我一个个回答也回答不过 ...