第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提供了一个呈现在其他部件上的可滚动区域视图,滚动区域用于显示框架内的 ...
随机推荐
- 4 urllib和urllib2的区别
4 urllib和urllib2的区别 这个面试官确实问过,当时答的urllib2可以Post而urllib不可以. urllib提供urlencode方法用来GET查询字符串的产生,而urllib2 ...
- 解决Python参考文档乱码问题
问题如下: 解决方案: 打开IE浏览器,随便输入一个网址,在页面空白处点击右键->编码->自动选择 再次重新开启python3 帮助文档即可
- Docker学习笔记:在Windows7下安装
下载 DockerToolbox-19.03.1.exe 进行安装: 安装比较简单,双击运行,点下一步即可,可以勾选自己需要的组件: 安装成功后,桌边会出现三个图标,如下图所示: 点击 Docker ...
- 基于CSS3伪元素和动画绘制旋转太极图
通过CSS3的动画知识来完成一个旋转的太极. 任务 1.创建一个div,用CSS控制其大小.边框.位置等,做成一个静态的圆形,一半为红色一半为白色. 2.用div的伪元素位置两个圆环并放置核实位置,使 ...
- Java开发环境搭建(若jdk8按默认安装后没有jre文件夹,卸载重装时选择完整安装)
JDK下载与安装(JDK 8是主流,新版版就是增加了一些新特性) 卸载旧JDK 删除java的安装目录 删除JAVA_HOME 删除path下关于java的目录 在cmd命令行中输入java vers ...
- //*[starts-with(@class,'btn')][text()='差'] 正则定位元素
starts-with? //*[starts-with(@class,'btn')][text()='差'] 意思找从头开始的这个class
- php include文件包含
XCTF题目:Web_php_include <?php show_source(__FILE__);//高亮显示源文件 echo $_GET['hello']; $page=$_GET['pa ...
- Linux学习 - 02 使用 - Centos8 - 网络配置相关
『Centos8 网络配置』 题外话:最近太忙,利用仅有的周末空闲时间记录点东西,草率了. 问题1:安装 Centos8.2 minimal 过程中,只是设置了 WiFi的静态IP,没有进行[以太网] ...
- Springboot使用EasyExcel(仅限自己收藏)
pom文件依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel< ...
- 20-SAP PI开发手册-ERP发布服务供外部系统调用(sproxy代理类)
一. 接口内容 接口详细信息 1. 字段对应关系 发送字段对应关系 返回字段对应关系 2. 报文信息 传入报文(报文结构,外围系统提供) 1 <?xml version=" ...