第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提供了一个呈现在其他部件上的可滚动区域视图,滚动区域用于显示框架内的 ...
随机推荐
- ner处理数据的方式
ner处理数据的方式biodef load_data(filename): features = [] labels = [] f = open(filename, encoding='utf-8') ...
- python 关键字yield
问题 Python 关键字 yield 的作用是什么?用来干什么的? 比如,我正在试图理解下面的代码: def node._get_child_candidates(self, distance, m ...
- layui下拉框实现级联
<!DOCTYPE html><html><head> <meta charset="utf-8" /> <link href ...
- CMake编译OpenCV4.0时opencv_ffmpeg.dll等下载失败的解决思路总结
一.Configure会报一些红色的警告信息,比如: 1 CMake Warning at cmake/OpenCVDownload.cmake:193 (message): 2 FFMPEG: Do ...
- 1、线性DP 198. 打家劫舍
198. 打家劫舍 https://leetcode-cn.com/problems/house-robber/ //dp动态规划,dp[i] 状态表示0-i家的盗的得最大值.那么dp[i] = (d ...
- binary hacks读数笔记(装载)
1.地址空间 在linux系统中,每个进程拥有自己独立的虚拟地址空间,这个虚拟地址空间的大小是由计算机硬件决定的,具体地说,是由CPU的位数决定的.比如,32位硬件平台决定的虚拟地址空间大小:0--2 ...
- SpringMVC源码之Handler注册、获取以及请求controller中方法
总结 对requestMappingHandlerMapping进行initializeBean时register Handler http开始请求时,initHandlerMappings,Disp ...
- rbd的image快照与Pool快照
前言 这个问题是不久前在ceph社区群里看到的,创建image的时候,当时的报错如下: 2016-12-13 23:13:10.266865 7efbfb7fe700 -1 librbd::image ...
- SpringIOC基础知识总结
目录 1.BeanFactory和ApplicationContext的区别: 2.实例化bean的三种方式: ⽅式⼀:使⽤⽆参构造函数 ⽅式⼆:使⽤静态⽅法创建 ⽅式三:使⽤实例化⽅法创建 3.Be ...
- web安全原理-文件包含漏洞
前言 起来吃完早饭就开始刷攻防世界的题,一个简单的文件包含题我竟然都做不出来我服了 拿出买的书开始从头学习总结文件包含漏洞! 一.文件包含漏洞 文件包含漏洞 文件包含函数的参数没有经过过滤或者严格的 ...