PyQt5快速入门(二)PyQt5信号槽机制

本文详细介绍了PyQt5中的信号槽机制,从信号槽的定义、应用到进阶使用,包括自定义信号槽、传递自定义参数及与装饰器的结合。同时,对比了信号槽与事件处理机制的区别,并展示了事件处理的方法和实例,帮助读者深入理解PyQt5编程。
摘要由CSDN通过智能技术生成

PyQt5快速入门(二)PyQt5信号槽机制

一、信号槽机制简介

1、信号槽简介

信号槽是Qt的核心机制,也是PyQt编程中对象进行通信的机制。在Qt中,QObject对象和PyQt中所有继承自QWidget的控件都支持信号槽机制。当信号发射时,连接的槽函数会自动执行。在PyQt5中,信号与槽函数通过object.signal.connect()方法进行连接。
信号槽特点如下:
(1)一个信号可以连接多个槽
(2)一个信号可以连接另一个信号
(3)信号参数可以是任意Python类型
(4)一个槽可以监听多个信号
(5)信号与槽的连接方式可以是同步连接,也可以是异步连接。
(6)信号与槽的连接可以跨线程
(7)信号可以断开
在编写一个类时,要首先定义的类的信号与槽,在类中信号与槽进行连接,实现对象之间的数据传输。当事件或状态发生变化时,会发出信号,进而触发执行事件或信号关联的槽函数。信号槽机制示意如下:
PyQt5快速入门(二)PyQt5信号槽机制

2、定义信号

PyQt的内置信号是自动定义的,使用PyQt5.QtCore.pyqtSignal函数可以为QObject对象创建一个信号,使用pyqtSignal函数可以把信号定义为类的属性。

class pyqtSignal:
    def __init__(self, *types, name: str = ...) -> None: ...

types参数表示定义信号时参数的类型,name参数表示信号的名称,默认使用类的属性名称。
使用pyqtSignal函数创建一个或多个重载的未绑定的信号作为类的属性,信号只能在QObject的子类中定义。信号必须在类创建时定义,不能在类创建后作为类的属性动态添加进来。使用pyqtSignal函数定义信号时,信号可以传递多各参数,并指定信号传递参数的类型,参数类型是标准的Python数据类型,包括字符串、日期、布尔类型、数字、列表、字典、元组。

from PyQt5.QtCore import pyqtSignal, QObject

class StandardItem(QObject):
    # 定义信号,信号有两个参数,两个参数的类型分别为str,str,信号名称为dataChanged
    data_changed = pyqtSignal(str, str, name="dataChanged")

    # 更新信息,发送信号
    def update(self):
        self.dataChanged.emit("old status", "new status")

3、操作信号

使用connect函数可以将信号绑定到槽函数上,使用disconnect函数可以解除信号与槽函数的绑定,使用emit函数可以发射信号。
QObject.signal.connect(self, slot, type=None, no_receiver_check=False)
建立信号到槽函数的连接,type为连接类型。
QObject.signal.disconnect(self, slot=None)
断开信号到槽的连接
emit(self, *args)
发送信号,args为可变参数。

import sys
from PyQt5.QtCore import pyqtSignal, QObject, QCoreApplication

class StandardItem(QObject):
    # 定义信号,信号有两个参数,两个参数的类型分别为str,str,信号名称为dataChanged
    data_changed = pyqtSignal(str, str, name="dataChanged")

    # 更新信息,发送信号
    def update(self):
        self.dataChanged.emit("old status", "new status")

    # 定义槽函数
    def onDataChanged(self, old, new):
        print(old)
        print(new)

if __name__ == "__main__":
    app = QCoreApplication(sys.argv)

    item = StandardItem()
    item.dataChanged.connect(item.onDataChanged)
    item.update()

    sys.exit(app.exec_
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值