第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提供了一个呈现在其他部件上的可滚动区域视图,滚动区域用于显示框架内的 ...
随机推荐
- 关于java和JS中的lastIndexOf方法的误解。
今天看JS的数组的lastIndexOf()方法,看书上的例子,怎么看都觉得不对劲.后来详细读了几遍解释,用java也测试了下,才发现,之前的理解完全是错误的. 上例子: String nums=&q ...
- mdp文件-Chapter4-MD.mdp
终于到了mdp系列的第四篇,最终MD模拟的mdp文件 先上代码,md.mdp 1 title = OPLS Lysozyme MD simulation 2 ; Run parameters 3 in ...
- 说一说packet poll 错误掩码的一个bug tcp udp packet poll细节有所不同 处理时需要注意
今天处理一个cpu标高的bug,原因:在poll 返回后将error事件当做POLLIN事件处理,fd 一直都在唤醒线程处理,但是rcv的时候没有数据: unsigned int datagram_p ...
- 重置ubuntu13.04 密码
方法如下: Restart Machine HOLD Shift Button ( You will get message "GRUB Loading") Select the ...
- Python_爬虫_urllib解析库
简介:提取网页保存到txt文件中 + 解析txt文件内容,取出内容 from urllib import request import re.json url="http://www.163 ...
- Python_PyQt5_打开文件并修改字体
在同文件夹下新建一个 测试文档.txt 再运行下面代码,可以实现效果 代码 1 #!Python3 2 # -*- coding:utf-8 -*- 3 4 """ 5 ...
- SNMP介绍及使用,超有用,建议收藏!
写在前面 如果你是对SNMP完全不了解,或者只想学习如何使用现成的SNMP工具,那你找对了文章,但如果你希望学习SNMP具体协议内容,推荐阅读官方的RFC文档. 1. 简介 SNMP(Simple N ...
- 重新认识C++的"cin >>"、"cout <<" 简简单单 - 快快乐乐
重新认识C++的"cin >>"."cout <<" 简简单单 - 快快乐乐 JERRY_Z. ~ 2020 / 11 / 24 转载请 ...
- 面试老被问LinkedList源码?看看阿里技术官是怎么深度剖析的吧!
前言 LinkedList底层是基于双向链表,链表在内存中不是连续的,而是通过引用来关联所有的元素,所以链表的优点在于添加和删除元素比较快,因为只是移动指针,并且不需要判断是否需要扩容,缺点是查询和遍 ...
- 怎么让我们的mac运行得更加流畅?让我们得工作事半功倍!
古语云:"工欲善其事,必先利其器."因此,一个运行流畅的Mac更能使我们的工作事半功倍.但又是什么导致电脑的运行不流畅呢? 其实这大多还是缓存垃圾过多.内存不足的原因.尝试安装了许 ...