PyQt5 自定义信号pyqtSignal深度总结

一、pyqtSignal基本使用步骤

1.创建自定义信号对象
2.创建槽函数
3.将自定义信号对象与槽函数绑定
4.自定义信号对象发射信号

知识点总结: 自定信号是Object类的一个类属性。 自定义信号必须在PyQt5的QObject类及其子类 (QWidget/QMainWindow等)中使用,这些类包含“connect”属性,否则,在这些类外面使 用,会报错,提示:AttributeError:'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'

(一)控件外使用自定义信号

from PyQt5.QtCore import QObject, pyqtSignal

class MyObject(QObject):
    # 1.创建自定义信号对象
    mySignal = pyqtSignal()
    '''
        自定信号是Object类的一个类属性。 自定义信号必须在PyQt5的QObject类及其子类
    (QWidget/QMainWindow等)中使用,这些类包含“connect”属性,否则,在这些类外面使
    用,会报错,提示:AttributeError:'PyQt5.QtCore.pyqtSignal' object has 
    no attribute 'connect'
    '''
def mySlot(): # 2.创建槽函数
    print("控件外自定义信号")
myObject=MyObject()
# 3.将自定义信号对象与槽函数绑定
myObject.mySignal.connect(mySlot)
# 4.自定义信号对象发射信号
myObject.mySignal.emit()

(二)控件外使用自定义信号

知识点总结: 自定信号是Object类的一个类属性。 自定义信号必须在PyQt5的QObject类及其子类 (QWidget/QMainWindow等)中使用,这些类包含“connect”属性,否则,在这些类外面使 用,会报错,提示:AttributeError:'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'

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

class mywin(QWidget):
    # 1.创建自定义信号对象
    mySignal=pyqtSignal()
    '''
        自定信号是Object类的一个类属性。 自定义信号必须在PyQt5中QWidget类及其子类中使
    用,这些类包含“connect”属性,否则,在这些类外面使用,会报错,提示:AttributeError:
    'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'
    '''
    def __init__(self):
        super(mywin, self).__init__()
        self.resize(300,200)
        self.setUI()
    def PrintText(self): # 2.创建槽函数
        print('控件内自定义信号')
    def setUI(self):
        # 3.将自定义信号对象与槽函数绑定
        self.mySignal.connect(self.PrintText)
        # 4.自定义信号对象发射信号
        self.mySignal.emit()
if __name__ == '__main__':
    app = QApplication(sys.argv)
    w=mywin()
    w.show()
    app.exec()

(三)非QObject类及子类中使用pyqtSignal运行程序报错情形

示例代码如下:

from PyQt5.QtCore import pyqtSignal
signal = pyqtSignal(object)
def Function():
    print('测试信号')
signal.connect(Function)
signal.emit()

报错提示如下:

二、参数

(一)参数传递机制

        在 PyQt5 中,emit() 方法用于发送信号并可携带相关参数。这些参数的作用是在信号发出时,将数据传递给与该信号连接的槽函数(或其他可调用对象)。

         通过在 emit() 方法中指定参数,可以让槽函数接收到这些数据,从而根据传递的数据进行相应的处理。

        信号可以定义为接受特定类型的参数,例如:

signal = pyqtSignal(str)  # 定义一个只能传递字符串类型参数的信号

        在这种情况下,使用 emit() 方法发送信号时,就只能传入字符串类型的参数:

signal.emit("Hello!") 

        这样,与该信号连接的槽函数在响应时,就可以接收到这个字符串参数 "Hello!",并进行相应的处理。

        例如,如果有一个槽函数 slot_function 与上述信号连接,它可能定义为:

def slot_function(message):  # 槽函数,接收一个字符串参数
    print(message) 

        当信号通过 emit("Hello!") 发送时,slot_function 会被调用,并将 "Hello!" 作为参数传递给它,从而打印出该字符串。

        如果信号定义为可以接受多个参数或不同类型的参数,那么在 emit() 方法中也需要按照相应的方式提供这些参数。

        这样,通过在 emit() 中传递参数,实现了信号发送者和接收者之间的数据传递,使得槽函数能够根据接收到的具体数据进行灵活的处理,增加了信号与槽机制的灵活性和功能性。可以根据具体的需求,自定义信号携带的参数类型和数量,以满足不同的交互和逻辑处理要求。

知识点总结:

        1.在自定义信号时可以指定emit方法传递的参数类型,如int类型参数;

        2.emit发送信号时,只能传入自定信号时设置的参数类型,否则会报错;

        3.槽函数中设置的参数,不管是任何参数名称,该参数的值都是emit方法传递的数据。

示例代码:

from PyQt5.QtCore import QObject, pyqtSignal

class MyObject(QObject):
    # 1.创建自定义信号对象
    signal = pyqtSignal(str)
def slot_function(message): # 2.创建槽函数
    print(message)
myObject=MyObject()
# 3.将自定义信号对象与槽函数绑定
myObject.signal.connect(slot_function)
# 4.自定义信号对象发射信号
myObject.signal.emit('Hello!')

(二)传递不同数据类型的参数

from PyQt5.QtCore import QObject, pyqtSignal
class CustSignal(QObject):
    # 声明一个无参数的信号
    signal1 = pyqtSignal()
    # 声明带一个int类型参数的信号
    signal2 = pyqtSignal(int)
    # 声明带一个int和str类型参数的信号
    signal3 = pyqtSignal(int, str)
    # 声明带一个列表类型参数的信号
    signal4 = pyqtSignal(list)
    # 声明带一个字典类型参数的信号
    signal5 = pyqtSignal(dict)
    # 声明一个多重载版本的信号,包括了一个带int和str类型参数的信号或着带str参数的信号
    signal6 = pyqtSignal([int, str], [str])
    def __init__(self, parent=None):
        super(CustSignal, self).__init__(parent)
        # 信号连接到指定槽
        self.signal1.connect(self.signalCall1)
        self.signal2.connect(self.signalCall2)
        self.signal3.connect(self.signalCall3)
        self.signal4.connect(self.signalCall4)
        self.signal5.connect(self.signalCall5)
        self.signal6[int, str].connect(self.signalCall6)  # 重载传递不同参数 ,int  str
        self.signal6[str].connect(self.signalCall6OverLoad)  # str

        # 信号发射
        self.signal1.emit()
        self.signal2.emit(1)
        self.signal3.emit(1, "text")
        self.signal4.emit([1, 2, 3, 4])
        self.signal5.emit({"name": "wangwu", "age": "25"})
        self.signal6[int, str].emit(1, "text")
        self.signal6[str].emit("text")

    def signalCall1(self):  # 无参函数
        print("signal1 emit")
    def signalCall2(self, val):  # int  型参数
        print("signal2 emit,value:", val)
    def signalCall3(self, val, text):  # int  str  参数
        print("signal3 emit,value:", val, text)
    def signalCall4(self, val):  # 列表 参数
        print("signal4 emit,value:", val)
    def signalCall5(self, val):  # 字典参数
        print("signal5 emit,value:", val)
    def signalCall6(self, val, text):  # 重载的 int str
        print("signal6 emit,value:", val, text)
    def signalCall6OverLoad(self, val):  # 重载的 str
        print("signal6 overload emit,value:", val)
if __name__ == '__main__':
    custSignal = CustSignal()
    '''
    本段笔记资料来源:https://blog.51cto.com/u_15866638/8545409
    '''

(三)参数传递的其他规律

自定义信号中的参数可以传递给槽函数使用。传参方式可以有以下几种:
1.槽函数的参数名称可以自定义信号中的参数名称相同,见槽函数def signalCall1。
2.槽函数的参数名称可以自定义信号中的参数名称不相同,见槽函数def signalCall2,但是传递效果同1。
3.槽函数中参数,可以全部使用自定义信号中的参数,也可以使用一部分,也可以不使用,见def signalCall3,def signalCall4
4.槽函数中的参数,传递自定义信号中的参数,按自定义信号中参数的位置顺序传递,而同槽函数中参数名称的无关,即槽函数的第一个参
数对应自定义信号中的第一个参数,函数的第二个参数对应自定义信号中的第二个参数,顺序依次类推,见def signalCall5。
from PyQt5.QtCore import QObject, pyqtSignal
class CustSignal(QObject):
    # 声明带一个int和str类型参数的信号
    signal = pyqtSignal(int, str)
    def __init__(self, parent=None):
        super(CustSignal, self).__init__(parent)
        # 信号连接到指定槽
        self.signal.connect(self.signalCall1)
        self.signal.connect(self.signalCall2)
        self.signal.connect(self.signalCall3)
        self.signal.connect(self.signalCall4)
        self.signal.connect(self.signalCall5)
        # 信号发射
        self.signal.emit(1, "字符串")
    def signalCall1(self, int, str):
        print("signal3 emit,value:", int, str)
    def signalCall2(self, a, b):
        print("signal3 emit,value:", a, b)
    def signalCall3(self, a):
        print("signal3 emit,value:", a)
    def signalCall4(self):
        print("signal3 emit,value:")
    def signalCall5(self, str, int):
        print("signal3 emit,value:", str, int)

if __name__ == '__main__':
    custSignal = CustSignal()
  • 13
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值