首页 > 其他分享 >如何快速理解信号与槽?

如何快速理解信号与槽?

时间:2022-12-15 12:00:32浏览次数:34  
标签:__ 函数 self 整数 理解 信号 快速 Signal

一、信号与槽的定义

(一)定义

  • 信号(Signal)和槽((Slot)是Qt中的核心机制,也是在PyQt编程中对象之间进行通信的机制。在Qt中,每一个QObject对象和 PyQt中所有继承自QWidget的控件(这些都是QObject的子对象)都支持信号与槽机制。当信号发射时,连接的槽函数将会自动执行。在 PyQt 5中信号与槽通过object.signal.connect()方法连接。

(二)特点

1、一个信号可以连接多个槽。

2、一个信号可以连接另一个信号。

3、信号参数可以是任何Python类型。

4、一个槽可以监听多个信号。

5、信号与槽的连接方式可以是同步连接,也可以是异步连接。

6、信号与槽的连接可能会跨线程。

7、信号可以断开。

二、信号与槽函数的四种用法

(一)内置信号和内置槽函数

from PyQt5.QtWidgets import *
import sys

class WinForm(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('内置的信号和内置的槽函数')
        self.resize(300, 50)
        btn = QPushButton('关闭', self)
        btn.clicked.connect(self.close)
        # 发送者btn——>信号clicked——>连接connect——>接收者self——>内置槽函数close


if __name__ == '__main__':
    app = QApplication(sys.argv)
    wind = WinForm()
    wind.show()
    sys.exit(app.exec_())

(二)内置信号和自定义槽函数

from PyQt5.QtWidgets import *
import sys


class WinForm(QWidget):
    def __init__(self, parent=None):
        super(WinForm, self).__init__(parent)
        self.setWindowTitle("内置信号与自定义槽函数示例")
        self.resize(330, 50)
        btn = QPushButton("关闭", self)
        btn.clicked.connect(self.btn_close)

    def btn_close(self):
        # 这里就是自定义槽函数,再调用内置槽函数close
        self.close()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = WinForm()
    win.show()
    sys.exit(app.exec_())

(三)自定义信号和内置槽函数

from PyQt5.QtWidgets import *
from PyQt5.QtCore import pyqtSignal
import sys


class Winform(QWidget):
    # 自定义信号
    button_clicked_signal = pyqtSignal()

    def __init__(self, parent=None):
        super(Winform, self).__init__(parent)
        self.setWindowTitle("自定义信号与内置槽函数示例")
        self.resize(330, 50)
        btn = QPushButton("关闭", self)
        # 连接自定义的信号函数
        btn.clicked.connect(self.btn_clicked)
        # 接收信号,连接到内置槽函数
        self.button_clicked_signal.connect(self.close)

    # 自定义的信号函数(也是内置信号clicked的槽函数)
    def btn_clicked(self):
        # 发送自定义信号
        self.button_clicked_signal.emit()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = Winform()
    win.show()
    sys.exit(app.exec_())

(四)自定义信号和自定义槽函数

from PyQt5.QtWidgets import *
from PyQt5.QtCore import pyqtSignal
import sys


class WinForm(QWidget):
    # 自定义信号
    button_clicked_signal = pyqtSignal()

    def __init__(self):
        super().__init__()
        self.setWindowTitle("自定义信号与槽函数示例")
        self.resize(330, 50)
        btn = QPushButton("关闭", self)
        # 连接自定义信号函数
        btn.clicked.connect(self.btn_clicked)
        # 接收信号,连接到自定义的槽函数
        self.button_clicked_signal.connect(self.btn_close)

    # 自定义的信号函数(作为自定义信号clicked的槽函数)
    def btn_clicked(self):
        # 发送自定义信号
        self.button_clicked_signal.emit()
    # 自定义的槽函数(调用内置槽函数)
    def btn_close(self):
        self.close()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = WinForm()
    win.show()
    sys.exit(app.exec_())

信号与槽的建立只需要以下四个步骤:

1、定义信号

2、定义槽函数

3、连接信号与槽函数

4、发送信号

三、信号与槽的高级用法

  • 高级用法主要可以进行参数传递
  • 通过信号与槽建立的四个步骤来介绍

(一)定义信号

import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtCore import pyqtSignal


class MyWidget(QWidget):
    # 无参信号
    Signal_NoParameters = pyqtSignal()
    # 带一个参数(整数)的信号
    Signal_OneParameter = pyqtSignal(int)
    # 带一个参数(整数或者字符串)的重载版本的信号
    Signal_OneParameter_Overload = pyqtSignal([int], [str])
    # 带两个参数(整数。字符串)的信号
    Signal_TwoParameters = pyqtSignal(int, str)
    # # 带两个参数([整数,整数]或者[整数,字符串])的重载版本的信号
    Signal_TwoParameters_Overload = pyqtSignal([int, int], [int, str])

(二)定义槽函数

  • 定义槽函数,它有多个不同的输入参数
    def setValue_NoParameters(self):
        """无参槽函数"""
        print("""无参槽函数""")

    def setValue_OneParameter(self, nIndex):
        """带一个参数(整数)的槽函数"""
        print("""带一个参数(整数)的槽函数""", nIndex)

    def setValue_OneParameter_String(self, snIndex):
        """带一个参数(字符串)的槽函数"""
        print("""带一个参数(字符串)的槽函数""", snIndex)

    def setValue_TwoParameters(self, x, y):
        """带两个参数(整数,整数)的槽函数"""
        print("""带两个参数(整数,整数)的槽函数""", x, y)

    def setValue_TwoParameters_String(self, x, szY):
        """带两个参数(整数,字符串)的槽函数"""
        print("""带两个参数(整数,字符串)的槽函数""", x, szY)

(三)连接信号与槽函数

		# 连接无参信号
        self.Signal_NoParameters.connect(self.setValue_NoParameters)

        # 连接带一个整数参数的信号
        self.Signal_OneParameter.connect(self.setValue_OneParameter)

        # 连接带一个整数参数,经过重载的信号
        self.Signal_OneParameter_Overload.connect(self.setValue_OneParameter_String)

        # 连接一个信号,有两个整数参数
        self.Signal_TwoParameters.connect(self.setValue_TwoParameters)

        # 连接带两个参数(整数,整数)的重载版本的信号
        self.Signal_TwoParameters_Overload[int, int].connect(self.setValue_TwoParameters)

        # 连接带两个参数(整数,字符串)的重载版本的信号
        self.Signal_TwoParameters_Overload[int, str].connect(self.setValue_TwoParameters_String)

(四)发送信号

    def mousePressEvent(self, event):
        # 发射无参信号
        self.Signal_NoParameters.emit()
        # 发射带一个参数(整数)的信号
        self.Signal_OneParameter.emit(1)
        # 发射带一个参数(整数)的重载版本的信号
        self.Signal_OneParameter_Overload.emit(1)
        # 发射带一个参数(字符串)的重载版本的信号
        self.Signal_OneParameter_Overload.emit('Abc')
        # 发射带两个参数(整数,字符串)的信号
        self.Signal_TwoParameters.emit(1, 'abc')
        # 发射带两个参数(整数,整数)的重载版本的信号
        self.Signal_TwoParameters_Overload.emit(1, 2)
        # 发射带两个参数(整数,字符串)的重载版本的信号
        self.Signal_TwoParameters_Overload.emit(1, 'abc')

(五)完整代码

import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtCore import pyqtSignal


class MyWidget(QWidget):
    """------------------一大片信号定义--------------------"""
    # 无参信号
    Signal_NoParameters = pyqtSignal()
    # 带一个参数(整数)的信号
    Signal_OneParameter = pyqtSignal(int)
    # 带一个参数(整数或者字符串)的重载版本的信号
    Signal_OneParameter_Overload = pyqtSignal([int], [str])
    # 带两个参数(整数。字符串)的信号
    Signal_TwoParameters = pyqtSignal(int, str)
    # # 带两个参数([整数,整数]或者[整数,字符串])的重载版本的信号
    Signal_TwoParameters_Overload = pyqtSignal([int, int], [int, str])

    def __init__(self):
        super().__init__()
        
        """------------------一大片信号连接---------------------"""
        # 连接无参信号
        self.Signal_NoParameters.connect(self.setValue_NoParameters)

        # 连接带一个整数参数的信号
        self.Signal_OneParameter.connect(self.setValue_OneParameter)

        # 连接带一个整数参数,经过重载的信号
        self.Signal_OneParameter_Overload.connect(self.setValue_OneParameter_String)

        # 连接一个信号,有两个整数参数
        self.Signal_TwoParameters.connect(self.setValue_TwoParameters)

        # 连接带两个参数(整数,整数)的重载版本的信号
        self.Signal_TwoParameters_Overload[int, int].connect(self.setValue_TwoParameters)

        # 连接带两个参数(整数,字符串)的重载版本的信号
        self.Signal_TwoParameters_Overload[int, str].connect(self.setValue_TwoParameters_String)

    """------------------一大片槽函数---------------------"""
    def setValue_NoParameters(self):
        """无参槽函数"""
        print("""无参槽函数""")

    def setValue_OneParameter(self, nIndex):
        """带一个参数(整数)的槽函数"""
        print("""带一个参数(整数)的槽函数""", nIndex)

    def setValue_OneParameter_String(self, snIndex):
        """带一个参数(字符串)的槽函数"""
        print("""带一个参数(字符串)的槽函数""", snIndex)

    def setValue_TwoParameters(self, x, y):
        """带两个参数(整数,整数)的槽函数"""
        print("""带两个参数(整数,整数)的槽函数""", x, y)

    def setValue_TwoParameters_String(self, x, szY):
        """带两个参数(整数,字符串)的槽函数"""
        print("""带两个参数(整数,字符串)的槽函数""", x, szY)

    """------------------发射信号函数---------------------"""
    def mousePressEvent(self, event):
        # 发射无参信号
        self.Signal_NoParameters.emit()
        # 发射带一个参数(整数)的信号
        self.Signal_OneParameter.emit(1)
        # 发射带一个参数(整数)的重载版本的信号
        self.Signal_OneParameter_Overload.emit(1)
        # 发射带一个参数(字符串)的重载版本的信号
        self.Signal_OneParameter_Overload.emit('Abc')
        # 发射带两个参数(整数,字符串)的信号
        self.Signal_TwoParameters.emit(1, 'abc')
        # 发射带两个参数(整数,整数)的重载版本的信号
        self.Signal_TwoParameters_Overload.emit(1, 2)
        # 发射带两个参数(整数,字符串)的重载版本的信号
        self.Signal_TwoParameters_Overload.emit(1, 'abc')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    widget = MyWidget()
    widget.show()
    sys.exit(app.exec_())
  • 效果

以上总结来自朝兮暮兮的CSDN博客,链接如下:https://blog.csdn.net/alijunshan/article/details/128274278

标签:__,函数,self,整数,理解,信号,快速,Signal
From: https://www.cnblogs.com/LoLong/p/16984651.html

相关文章

  • !!!!深入理解离散傅里叶变换(DFT)
    前面写过一篇傅里叶变换的文章:https://zhuanlan.zhihu.com/p/66117227但是在工程应用中,得益于数字技术的应用,绝大多数傅里叶变换的应用都是采用离散傅里叶变换(DFT),更确切......
  • 如何快速拥有好的测试idea
    如果接手任意一个测试任务,如何开始测试以及怎么快速的形成测试点呢?其实也是有一套小套路的。大概整理了下,可以从6个方面来考虑入手。1.项目快速了解项目背景、......
  • 如何快速从使用Eclipse转用IDEA
    ​​https://www.toutiao.com/i6515289836159500804/#6649976-tsina-1-44054-4471e2b057b5019ad452c722f04bba39​​1.先来看快捷键上的异同:2.其他常用快捷键:ALT+回车:错误自......
  • 基于GRNN网络和小波变换的ECG信号睡眠监测matlab仿真
    目录​​一、理论基础​​​​二、核心程序​​​​三、仿真测试结果​​作者ID:fpga和matlab擅长技术:1.无线基带,无线图传,编解码2.机器视觉,图像处理,三维重建3.人工智......
  • 深入理解mybatis原理(八) MyBatis事务管理机制
     MyBatis作为​​Java​​语言的​​数据库​​框架,对​​数据库​​的事务管理是其非常重要的一个方面。本文将讲述MyBatis的事务管理的实现机制。首先介绍MyBatis的事务......
  • 深入理解mybatis原理(一) Mybatis初始化机制详解
     对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外。本章将通过以下几点详细介绍MyBatis的初始化过程。   1.MyBatis的初始化做了什么   2.MyBati......
  • HashMap原理解析
    1.HashMap的数据结构数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端。时间复杂度小,为O(1);数组的特点是:寻址容易,插入和删除困难;链表链表存储区间离散......
  • qt-信号与槽初步
    接下来,我们将沿着上一篇的进度,学习如何将按钮与退出程序建立连接。建立连接是什么意思呢,我们就拿按钮来解释一下。按钮可以被按下。显然当按钮按下的时候,我们希望程序做出......
  • 一名曾因线上P0故障导致月工资扣了10%的码农心得:如何在故障10分钟黄金时间快速排障
    “本文作者是曾有4年开发经验,期间担任过多个项目团队的开发leader,现任Kindling开源团队的产品经理。作者曾因一次愚蠢的操作引发了线上P0故障,导致月工资扣了10%,年底绩效-1,......
  • 如何快速构建企业级数据湖仓?
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群本文整理自火山引擎开发者社区技术大讲堂第四期演讲,主要介绍了数据湖仓开源趋势、火山......