第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提供了一个呈现在其他部件上的可滚动区域视图,滚动区域用于显示框架内的 ...
随机推荐
- python_选课系统
import sys import pickle import os USERINFO = r'C:\Users\12078\PycharmProjects\OldBoy\选课系统\userinfo' ...
- 【转】linux自测题
一.填空题: 1. 在Linux系统中,以 文件 方式访问设备. 2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统. 3. Linux文件系统中每个文件用 i节点 来标 ...
- 80%人会答错的JS基础面试题
这套题第一道题难度最大,我第一遍的回答居然也错的,我悲观估计80%的JavaScript从业人员都答不完全准确 []==![] 得到什么? false, 你还需要看看基础 true, 恭喜你答对了,你 ...
- Interface(接口分享)第一节
一.接口初探 有时候我们传入的参数可能会包含很多的属性,但是编译器只会检查那些必须的属性是否存在,以及类型是否匹配,而咱们要讲的接口其实就是用来描述下面这个例子里的结构,对于接口传入的数据咱们只关心它 ...
- full nat
在餐馆吃饭时,连接无线网络后访问某网页会自动弹出一个认证页面,我想大家都经历过..... 其网络拓扑如下: sta-------------网络设备--------------公网 比如sta 终端i ...
- C++的四种强制转型形式:
C++同时提供了四种新的强制转型形式(通常称为新风格的或C++风格的强制转型): const_cast(expression)dynamic_cast(expression)reinterpret_c ...
- TCP回射客户服务器模型(02 设置套接字选项、处理多并发)
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); //设置套接字选项 ...
- 《GNU_makefile》第五章——为规则书写命令
1. 使用make的命令行参数-n或--just-print,make会只显示要执行的命令,不执行,这样方便调试makefile. 2.执行命令 每写一行命令,make会fork出一个shell进程来 ...
- java1.8安装及环境变量配置
一.前言 虽然jdk1.9版本已经问世,但是许多其他的配套设施并不一定支持jdk1.9版本,所以这里仅带领你配置jdk1.8.而jdk1.9的操作也几乎是相同的. 本教程适用于windows10 64 ...
- linux中KVM桥接网卡br0
在centos虚拟化当中需要增加一个桥接网卡,然后将虚拟化当中的机器的网卡桥接到桥接网卡,下面将描述设置方法: 查看现有网卡 [root@zb ~]# vim /etc/sysconfig/netwo ...