PySide2学习总结(八)Qt的信号(Signal)和槽(Slot)

2023-12-28 06:38

本文主要是介绍PySide2学习总结(八)Qt的信号(Signal)和槽(Slot),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

在GUI编程过程中,经常需要进行通信的处理,往往需要各种类型的对象之间进行通信,比如,当用户点击了某个按钮,我们希望它调用某个功能输出一些提示信息。
在其他编程工具中往往使用“回调”技术来实现对象之间的通信。“回调”是将函数的指针(地址)作为参数传递给另一个处理函数,并在该函数内利用这个参数来调用原函数。

简介

在Qt中使用信号和槽(Signals and Slots)来实现其他编程工具包的“回调”功能。
信号和槽机制是 Qt 的主要特性并且也很有可能是它与其他框架特性区别最大的部分。
当一个特定的事件发生时,信号会被发送出去,而槽则被用来接收信号。

信号和槽

Qt的窗体部件(widget)拥有众多预先定义好的信号,当然,我们也可以创建窗体部件(widget)的子类来为它们添加自定义信号。
槽,则是对一个特定的信号进行的反馈。Qt的窗体部件(widget)同样拥有众多预先定义好的槽,但是通常的做法是,创建窗体部件(widget)的子类并添加自定义槽,以便对特定的信号进行处理。

信号-槽机制是类型安全的:一个信号的签名(参数类型)必须与它的接收槽的签名相匹配。
信号和插槽是松散耦合的:一个发射信号的类不用知道也不用关心哪个槽要接收这个信号。
信号和槽可以使用任何数量、任何类型的参数。

对象中以这种方式通信:当对象改变其状态时,信号就由该对象发射 (emit) 出去,这就是对象所要做的全部事情,发送信号的对象不需要知道什么对象接收它所发出的信号,这是真正的信息封装,保证了对象能被当作软件组件来使用。而关心这个改变的另一对象则会接收这个信号。

槽能被用来接收信号,除此之外它们也是普通的成员函数。槽不知道是否有信号与它连接起来,正如对象不知道它发出信号是否会被接收一样。这样的机制确保了可以使用Qt创建一个个完全独立的组件。

信号与槽之间可以一对一连接,也可以把一个信号与多个槽进行连接。甚至可以直接把一个信号连接到另一个信号(当第一个信号发送出去的时候,第二个信号紧接着被发送)。信号-槽机制完全独立于任何 GUI 事件循环。只有当所有的槽返回以后发射函数(emit)才返回。如果存在多个槽与某个信号相关联,那么,当这个信号被发射时,这些槽将会一个接一个地执行,但是它们执行的顺序将会是随机的、不确定的,我们不能人为地指定哪个先执行、哪 个后执行。

就这样,信号与插槽建立了强大的组件编程机制。

编程示例

简单例子

这里使用了前面的button示例的代码:

import sys
from PySide2.QtWidgets import QApplication, QPushButton
from PySide2.QtCore import Slot# @Slot()是一个装饰器,标志着这个函数是一个slot(槽)
@Slot()
def output():
"""在控制台输出内容"""print("Button clicked")app = QApplication(sys.argv)
# 创建一个button
button = QPushButton("clicked me")
# 将信号和槽进行连接
button.clicked.connect(output)
button.show()app.exec_()

在这个例子中,我们定义了一个槽output()和一个按钮的点击信号,并通过connect将二者进行连接。这样,当点击按钮时槽就会接收到这个点击信号,相当于调用了output()。

带参数示例

当使用带有参数的信号和槽时,在定义的时候,需要注意声明所带的参数类型。

import sys
from PySide2.QtWidgets import QApplication
from PySide2.QtCore import QObject, Signal, Slot# 定义一个带有字符串参数的槽
@Slot(str)
def output(str):print(str)class Test(QObject):# 自定义一个信号output_str = Signal(str)output_key = Test()
output_key.output_str.connect(output)
# 发射信号
output_key.output_str.emit("Signal emit with para")app = QApplication(sys.argv)
app.exec_()

运行效果如图:
在这里插入图片描述

多个信号连接一个槽

当多个信号传入不同类型参数时,需要增加槽所能接收的参数类型:

import sys
from PySide2.QtWidgets import QApplication
from PySide2.QtCore import QObject, Signal, Slot# 增加槽的可接收参数类型
@Slot(str)
@Slot(int)
def output(str):print(str)class Test(QObject):# 自定义不同参数类型的信号output_str = Signal(str)output_int = Signal(int)output_key = Test()
output_key.output_str.connect(output)
output_key.output_int.connect(output)
# 发射信号
output_key.output_str.emit("Signal emit with para")
output_key.output_int.emit(111)app = QApplication(sys.argv)
app.exec_()

运行效果如图:
在这里插入图片描述
当每次只传入其中一种参数时,可以改写成如下形式:

import sys
from PySide2.QtWidgets import QApplication
from PySide2.QtCore import QObject, Signal, Slot# 增加槽的可接收参数类型
@Slot(str)
@Slot(int)
def output(str):print(str)class Test(QObject):# 自定义不同参数类型的信号# 声明可接收的参数类型,但每次只能够接收其中一种output_str = Signal((str,),(int,))output_key = Test()
# 未对参数类型进行设置即默认为第一个参数类型
output_key.output_str.connect(output)
output_key.output_str[int].connect(output)
# 发射信号
output_key.output_str.emit("Signal emit with para")
output_key.output_str[int].emit(111)app = QApplication(sys.argv)
app.exec_()

当需要同时传入多种类型参数时,只需要添加多个参数并一一声明类型即可:

import sys
from PySide2.QtWidgets import QApplication
from PySide2.QtCore import QObject, Signal, Slot# 增加槽的接收参数
@Slot(str)
@Slot(int)
def output(str, int):print(str, int)class Test(QObject):# 自定义不同参数类型的信号# 声明可接收的参数类型,但每次只能够接收其中一种output_str = Signal(str, int)output_key = Test()
output_key.output_str.connect(output)
# 发射信号
output_key.output_str.emit("Signal emit with para", 111)app = QApplication(sys.argv)
app.exec_()

代码整理

import sys
from PySide2.QtWidgets import QApplication                                                                  
from PySide2.QtCore import QObject, Signal, Slotclass Test(QObject): output_str = Signal((str, int), (str,))     def __init__(self): super(Test, self).__init__()self.output_str[str].connect(self.output)self.output_str[str, int].connect(self.output_two)def exec_emit(self):self.output_str[str].emit("Signal emit with para")self.output_str[str, int].emit("Signal emit with para", 111)@Slot(int)@Slot(str)def output(self, str_or_int):print(str_or_int)@Slot(int)@Slot(str)def output_two(self, str, int):print(str, int)output_key = Test()
output_key.exec_emit()app = QApplication(sys.argv)
app.exec_()

运行效果如图:
在这里插入图片描述

这篇关于PySide2学习总结(八)Qt的信号(Signal)和槽(Slot)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/545241

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识