第15.19节 PyQt(Python+Qt)入门学习:自定义信号与槽连接
一、引言
本文利用中介绍了PyQt中的信号和槽机制,除了使用PyQt组件的已有信号外,PyQt和Qt一样支持自定义信号。本节将介绍自定义信号及其他信号、槽的高级特性。
二、自定义信号的简单例子
2.1、案例说明
在一个图形界面类中类变量内定义一个信号selfSig,在类的实例方法中定义一个方法sigRecv作为槽函数接收信号、在构造方法中完成信号和槽的连接。
为了发送信号,在图形界面中有个名为emitSig的信号发送按钮,在Designer中进行了按钮的clicked信号和槽函数emitSigStart的关联。当按下按钮时,将按钮后面输入行中的内容发送出去,emitSigStart槽函数则将接收到的内容在显示窗w_displayInf中显示。
案例的主程序名为sigApp.py,图形界面文件为:ui_mainWin.ui,图形界面生成的代码为ui_mainWin.py,图形界面生成代码的类名为:Ui_w_mainWin。zaipycharm的工程文件截图:

2.2、案例运行截图

2.3、案例主程序代码
# -*- coding: utf-8 -*-
import sys
from PyQt5 import QtWidgets,QtCore,QtGui
import ui_mainWin
class w_mainWin(ui_mainWin.Ui_w_mainWin,QtWidgets.QWidget):
selfSig = QtCore.pyqtSignal(str) #定义信号,带一个str类型的参数
def __init__(self): #构造方法
super(w_mainWin, self).__init__()
self.setupUi(self)
self.selfSig[str].connect(self.sigRecv) #连接信号和槽
def emitSigStart(self): #图形界面按钮clicked信号的槽函数
info = self.sigInfo.text()
self.selfSig[str].emit(info)
def sigRecv(self,info): #接收信号的槽函数
self.w_displayInf.append(f"Received sinal:{info}")
三、自定义信号的案例详解
上面介绍的案例,是一个类内的信号和槽函数绑定,如果要实现类似功能,完全无需通过自定义信号和槽的机制来实现,直接点击按钮将输入行内文本添加到显示窗就可以,但通过这个案例可以比较清楚的知道PyQt中自定义信号及使用的过程,当信号和槽不在一个对象时相关步骤及方法是一样的,只是连接时的对象名不同,没有本质区别。
3.1、定义信号
3.1.1、语法
定义信号的本质就是在类体中使用QtCore.pyqtSignal定义一个类变量,QtCore.pyqtSignal的完整语法如下:
PyQt5.QtCore.pyqtSignal(types[, name[, revision=0[, arguments=[]]]])
上面案例的信号定义在类开始处:
selfSig = QtCore.pyqtSignal(str) #定义信号,带一个str类型的参数
3.1.2、参数释义
types :定义信号的C++签名(函数签名由参数个数与其类型组成。函数在重载时,利用函数签名的不同即参数个数与类型的不同来区别调用者到底调用的是那个方法)的类型。每种类型都可以是Python类型对象,也可以是一个C++类型的字符串,或者,每一个都可以是一个序列(如列表)类型参数,在这种情况下,每个序列定义不同信号重载的签名,即同一个信号名有不同签名(即信号名相同、签名不同的重载信号),每个签名是一序列类型,第一个序列将是重载缺省签名。
name:信号名字,如果信号名就是类变量名则可以省略该参数,由于types参数是可变的,因此本参数使用必须通过关键字参数方式传值,即name=‘信号名’方式
revision、arguments:都是关键字参数,用于输出到QML使用,QML是Qt使用的一种类似css和js功能叠加的脚本语言,老猿没准备学习和介绍,因此这两个参数在此就不关注了。
3.1.3、返回值
pyqtSignal定义返回的就是一个信号,但这时的信号与普通的类变量差不多,并没有信号相关的方法。以上例为例,在信号定义返回后调试模式下观察selfSig这个变量的情况,如图(因为是类变量,所以必须带类名观察):

3.2、信号与槽的连接
3.2.1、语法
自定义信号与槽的连接与PyQt内部定义信号与槽的连接本质上是一样的,都是调用信号的connect方法,相关方法语法如下:
connect(slot[, type=PyQt5.QtCore.Qt.AutoConnection[, no_receiver_check=False]])
上面案例中的连接语句在构造方法内,如下:
self.selfSig[str].connect(self.sigRecv) #连接信号和槽
3.2.2、参数释义
- slot:信号需要连接的槽,可以是一个与信号匹配的某个对象的回调方法、也可以是一个已经绑定的有相同签名的其他信号
- type:连接的类型,其类型为枚举类型Qt.ConnectionType,有如下种取值:

- no_receiver_check:如果为True,禁止检查下层的C++接收对象实例是否还存在,不管怎样都要发出信号,默认值为False。
3.2.3、返回值
connect调用后,如果正常返回,则返回对象为一个 Connection对象,这个对象在 当要执行disconnect断开信号与槽的连接时使用,这是断开信号与一个lambda函数的连接的唯一方法。
3.3、发射信号
发射信号非常简单,就是调用信号的方法emit。语法如下:
emit(*args)
参数args:传递给所有连接槽的可选参数序列。
上面案例的发射信号语句如下:
self.selfSig[str].emit(info)
四、小结
本节通过一个简单案例介绍了PyQt中怎么自定义一个信号、怎么连接一个信号,当信号定义好以后,就与Qt内置信号没有本质的区别,如果将信号所在对象通过相关方法定义成一个Qt Designer的插件时,信号就能在Designer中直接可见和操作。
更多关于信号和槽的内容请参考《 专栏:使用PyQt开发图形界面Python应用》中《第六章 信号和槽进阶–自定义信号及其他信号、槽的高级特性》的内容。

老猿Python,跟老猿学Python!
第15.19节 PyQt(Python+Qt)入门学习:自定义信号与槽连接的更多相关文章
- 第15.25节 PyQt(Python+Qt)入门学习:Model/View开发实战--使用QTableView展示Excel文件内容
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 在前面的订阅专栏<第十九章.Model/View开发:QTableView的功能及属 ...
- 第15.16节 PyQt(Python+Qt)入门学习:PyQt中的信号(signal)和槽(slot)机制以及Designer中的使用
老猿Python博文目录 老猿Python博客地址 一.引言 前面一些章节其实已经在使用信号和槽了,但是作为Qt中最重要的机制也是Qt区别与其他开发平台的重要核心特性,还是非常有必要单独介绍. 二.信 ...
- 第15.38节 PyQt(Python+Qt)入门学习:containers容器类部件QDockWidget停靠窗功能详解
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.概述 QDockWidget类提供了一个可以停靠在QMainWin ...
- 第15.18节 PyQt(Python+Qt)入门学习:Model/View架构中视图Item Views父类详解
老猿Python博文目录 老猿Python博客地址 一.概述 在PyQt图形界面中,支持采用Model/View架构实现数据和界面逻辑分离,其中Model用于处理数据存储,View用于界面数据展现,当 ...
- 第15.37节 PyQt(Python+Qt)入门学习:containers容器类部件QMdiArea多文档界面部件详解及编程开发案例
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.引言 老猿在前期学习PyQt相关知识时,对每个组件的属性及方法都研 ...
- 第15.28节 PyQt(Python+Qt)入门学习:Model/View架构中的便利类QTableWidget详解
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 表格部件为应用程序提供标准的表格显示工具,在表格内可以管理基于行和列的数据项,表格中的最大 ...
- 第15.33节 PyQt(Python+Qt)入门学习:containers容器类部件QTabWidget选项窗部件简介
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 容器部件就是可以在部件内放置其他部件的部件,在Qt Designer中可以使用的容器部件有 ...
- 第15.31节 PyQt(Python+Qt)入门学习:containers容器类部件GroupBox分组框简介
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 容器部件就是可以在部件内放置其他部件的部件,在Qt Designer中可以使用的容器部件有 ...
- 第15.29节 PyQt(Python+Qt)入门学习:containers容器类部件QScrollArea滚动区域详解
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 Scroll Area提供了一个呈现在其他部件上的可滚动区域视图,滚动区域用于显示框架内的 ...
随机推荐
- Metasploitable3学习笔记--永恒之蓝漏洞复现
漏洞描述: Eternalblue通过TCP端口445和139来利用SMBv1和NBT中的远程代码执行漏洞,恶意代码会扫描开放445文件共享端口的Windows机器,无需用户任何操作,只要开机上网,不 ...
- 《Python3反爬虫原理与绕过实战》作者韦世东
可以用(k1,k2)-k1来设置,如果有重复的key,则保留key1,舍弃key2/打印appleMap{1=Apple{id=1,name=苹果1,money=3.25,num=10},2=Appl ...
- 蒲公英 · JELLY技术周刊 Vol.30: 此路不通?Vue 3 新提案 Ref-sugar
蒲公英 · JELLY技术周刊 Vol.30 随着 Vue 3 发布,相关的新闻也逐渐火热起来,而近期 RFC 中两个新的提案也因为某乎上的一些事情变得广为人关注.Ref sugar和script s ...
- Java基础 之二 类和对象
1.基础概念 1) 概念 简单来说,类是具有相同特征事物的抽象,比如有轮子的都可以抽象为车:对象则可以看做类的具体实例,比如创建一个法拉利的车,就是车这个类的实例. 抽象.封装.继承.多态是类的四个特 ...
- Scrum转型(一) 为什么敏捷和Scrum
1.1 为什么敏捷 由于传统的瀑布模型管理方法无法满足现代某些软件产品开发过程的特点,我们需要使用敏捷的方法(例如,Scrum是一个让我们关注于在短时间里交付高质量商业价值的敏捷框架). 需求频繁变动 ...
- java版飞机大战代码
@ 目录 前言 Plane PlaneStatus类 Power类 Gift Diji play类 over类 MainFrame主类 MyZiDan DijiZiDan Before 前言 很久之前 ...
- 头秃了,Spring Boot 自动配置了解一波~
持续原创输出,点击上方蓝字关注我 目录 前言 源码版本 @SpringBootApplication干了什么? @EnableAutoConfiguration干了什么? 总结 前言 为什么Sprin ...
- php 把一个数随机分成n份
$money_total=100; $personal_num=10; $min_money=0.01; $money_right=$money_total; $randMoney=[]; for($ ...
- HarmonyOS Java UI之DependentLayout布局示例
DependentLayout简介 DependentLayout意为相对位置布局,与DirectionalLayout相比较有更多的排布方式,每个组件可以指定相对于其他同级组件的位置,也可以指定相对 ...
- 【电子取证:FTK Imager篇】DD、E01系统镜像仿真
星河滚烫,人生有理想! ---[suy999] DD.E01系统镜像动态仿真 (一)使用到的软件 1.FTK Imager (v4.5.0.3) 2.VMware Workstation 15 P ...