首页 > 其他分享 >05. 信号与槽

05. 信号与槽

时间:2024-12-13 23:31:50浏览次数:7  
标签:__ 05 self emit 信号 Signal def

一、信号与槽

  信号(signal)与 (slot)是 Qt 的核心机制,也是进行 PySide6 编程时,对象与对象之间通信的基础。在 PySide6 中,每一个 QObject 对象(包括各种窗口控件)都支持信号与槽机制。通过信号与槽的关联,就可以实现对象之间的通信。

  信号 是指从 QObject 类继承的控件(窗口、按钮、文本框、列表框等)在某个动作下或状态发生改变时发出的一个指令或一个信息。 是系统对控件发出的信号进行的响应,或者产生的动作,通常用函数来定义系统的响应或动作。当信号发射时,连接的 槽函数(方法)将会自动执行。在 PySide6 中,信号与槽是通过对象的 signal.connect() 方法进行连接的。信号与槽的关系可以是一对一,也可以是多对多,即一个信号可以关联多个槽函数,一个槽函数也可以接收多个信号。

  PySide6 中信号与槽的主要特点如下:

  • 一个信号可以连接多个槽;
  • 一个槽可以监听多个信号;
  • 信号与信号之间可以互联;
  • 信号与槽的连接可以跨线程;
  • 信号与槽的连接即可以是同步的,也可以是异步的;
  • 信号的参数可以是任何的 Python 类型;

  我们可以在终端中使用 pip 安装 pyside6 模块。

pip install pyside6
控件.信号.connect(槽函数)

def 槽函数():
    pass
import sys

from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QPushButton, QMessageBox

class MyWidget(QWidget):
    def __init__(self):
        # 1.调用父类Qwidget类的__init__()方法
        super().__init__()
        # 2.调用setupUi()方法初始化页面
        self.setupUi()

    def setupUi(self):
        # 1.设置窗口对象大小
        self.resize(700, 500)
        # 2.创建按钮控件
        pushButton = QPushButton(self)
        # 3.按钮控件的显示文本
        pushButton.setText("退出")
        # 4.将按钮的clicked信号与自定义的槽函数关联
        pushButton.clicked.connect(self.show_message)

    def show_message(self):
        # 使用information()方法弹出信息提示框
        # 第一个参数是窗口对象,表示该对话框所属的窗口
        # 第二个参数是对话框的标题
        # 第三个参数是对话框的提示文本
        # 第四个参数是对话框中操作按钮,多个按钮之间用|分开
        select = QMessageBox.information(self, "提示框", "你是否要退出呢?", QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No)
        if select == QMessageBox.StandardButton.Yes:
            sys.exit(app.exec())

if __name__ == "__main__":
    # 1.创建一个QApplication类的实例
    app = QApplication(sys.argv)
    # 2.创建一个窗口
    window = MyWidget()
    # 3.展示窗口
    window.show()
    # 4.进入程序的主循环并通过exit()函数确保主循环安全结束
    sys.exit(app.exec())

二、自定义信号

  除了可以用控件的内置信号外,还可以自定义信号。自定义信号可以不带参数,也可以带参数,可以带 1 个参数,也可以带多个参数。参数类型是任意的,参数类型需要在定义信号时进行声明。自定义信号通常需要在类属性位置用 Signal 类来创建,使用 Signal 前需要用 from PySide6.QtCore import Signal 语句导入 Signal 类。需要注意的是,只有继承自 QObject 的类才可以定义信号。

# 定义非重载型信号
signName = Signal(type1, type2, ...)

  其中,signalName信号名称Signal() 用于 创建信号实例对象type信号发送时附带的数据类型,这里数据类型不是形参也不是实参,只是类型的声明,参数类型任意,需根据实际情况确定。

  定义一个信号后,信号就有 连接 connect()发送 emit()断开 disconnect() 属性,需要注意的是,只有从 QObject 继承的类才可以定义信号。

from PySide6.QtCore import QObject, Signal

class SignalDefinition(QObject):
    s1 = Signal()                               # 创建无参数的信号
    s2 = Signal(int)                            # 创建带整数的信号
    s3 = Signal(float)                          # 创建带浮点数的信号
    s4 = Signal(str)                            # 创建带字符串的信号
    s5 = Signal(int, float, str)                # 创建带整数、浮点数和字符串的信号
    s6 = Signal(list)                           # 创建带列表的信号
    s7 = Signal(dict)                           # 创建带字典的信号

    def __init__(self, parent=None):
        super().__init__(parent)

        # 信号与槽的连接
        self.s1.connect(self.slot1)
        self.s2.connect(self.slot2)
        self.s3.connect(self.slot3)
        self.s4.connect(self.slot4)
        self.s5.connect(self.slot5)
        self.s6.connect(self.slot6)
        self.s7.connect(self.slot7)

        # 提交信号
        self.s1.emit()
        self.s2.emit(10)
        self.s3.emit(11.11)
        self.s4.emit("你好,世界!")
        self.s5.emit(10, 11.11, "你好,世界!")
        self.s6.emit([10, 11.11, "你好,世界!"])
        self.s7.emit({"1": "Sakura", "2": "Shana"})

    def slot1(self):
        print("s1 emit")

    def slot2(self, value):
        print("s2 emit int: ", value)

    def slot3(self, value):
        print("s3 emit float: ", value)

    def slot4(self, string):
        print("s4 emit string: ", string)

    def slot5(self, value1, value2, string):
        print("s5 emit many values: ", value1, value2, string)

    def slot6(self, list_value):
        print("s6 emit list: ", list_value)

    def slot7(self, dict_value):
        print("s7 emit dict: ", dict_value)

if __name__ == "__main__":
    signalTest = SignalDefinition()

标签:__,05,self,emit,信号,Signal,def
From: https://www.cnblogs.com/FlurryHeart/p/18606107

相关文章

  • Golang学习笔记_05——延迟调用
    Golang学习笔记_02——函数Golang学习笔记_03——匿名函数和闭包Golang学习笔记_04——递归函数文章目录延迟调用1.延迟调用1.1使用场景1.2示例2.panic2.1使用场景2.2示例3.recover3.1使用场景3.2示例源码延迟调用在Go语言中,延迟调用(defer)是一个......
  • 记录_信号完整性上机报告
    《信号完整性》实验报告实验工程图:2.1阻抗突变处的反射:一、实验目的本实验旨在研究信号在遇到传输线阻抗突变时产生的反射现象。通过设置不同阻抗的传输线,模拟和分析信号反射系数的变化,观察反射对信号波形的影响。实验的核心目标是理解阻抗突变如何影响信号传播,计算反射系数,......
  • Acrobat Pro DC 2024.005 像word一样编辑PDF
    随着数字化的推广,PDF文件凭借其强大的优势和稳定性逐渐成为各类文档交流和存储的首选格式。随之而来的是对PDF文件的阅读、编辑、转换、转曲等各种操作需求的不断增长。因此,一款强大的PDF处理软件不仅需要满足用户多变需求,还需要通过友好的界面和高效的功能,提升了用户的工作效......
  • AI智能分析视频分析网关接入监控后,画面显示无视频信号或图像不显示是什么原因?
    在监控项目的实施过程中,调试阶段常常会遇到各种问题,尤其是图像无法显示的情况。这种现象在监控系统调试中非常普遍,令许多技术人员感到困惑和挫败。究竟是什么原因导致这些问题的出现?如何有效地进行排查和解决?本文将总结在调试过程中遇到的常见问题及其解决方案,包括线缆问题、供电......
  • PySide 信号与槽机制详解
    PySide信号与槽机制详解引言PySide是一个用于创建跨平台桌面应用程序的Python绑定库,它封装了Qt库的功能。Qt的核心特性之一是它的信号与槽(SignalsandSlots)机制,这是一种对象间通信的方法。在PySide中,这种机制允许开发者轻松地连接用户界面元素的行为和应用程序......
  • [Linux]信号
    信号认识信号什么是信号信号本质上是一种软件中断,用于通知进程发生了特定的事件。进程接收到信号后,会根据信号的类型采取相应的操作。拿生活中的红绿灯来举例,当你看到红灯的时候你不会过马路,当变为绿灯时才会通过。但是也有可能在等红灯的时候,此时绿灯亮了而你正在打游戏,游戏......
  • 信号与槽机制的使用
    在现代GUI开发中,Qt框架因其强大的功能和灵活性而备受欢迎。Qt的信号与槽(SignalandSlot)机制是其核心特性之一,用于实现对象间的通信。本文将详细介绍这一机制,并结合实际使用场景讲解其应用方式。文章目录一、什么是信号与槽信号二、信号与槽的连接三、Qt::ConnectionT......
  • Springboot计算机毕业设计小雨杂志在线投稿059m7
    Springboot计算机毕业设计小雨杂志在线投稿059m7本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能:用户,网站简介,在线投稿,专家信息开题报告内容Springboot计算机毕业设计:小雨杂志在线投稿系统开......
  • 信号处理:概念、应用、领域、方法
    信号处理是一个广泛的领域,涉及对各种类型信号(如音频信号、图像信号、生物信号、通信信号等)的分析、操作和变换。信号处理的主要目标是获取有用信息、增强信号质量、消除噪声、提取特征以及实现数据compression等。信号处理可以分为模拟信号处理和数字信号处理两大类别。一、......
  • 105. 从前序与中序遍历序列构造二叉树
    问题描述分析逻辑上,从前序遍历中依次从前往后获取根结点,从中序里获取根结点的序号后可以获取左子树和右子树,递归构建树即可。分治/递归classSolution{public:vector<int>preorder;vector<int>inorder;unordered_map<int,int>um;//分治TreeNo......