程序员文章、书籍推荐和程序员创业信息与资源分享平台

网站首页 > 技术文章 正文

Python快速入门系列:PyQt5 深入理解信号与槽机制

hfteth 2025-01-20 13:16:45 技术文章 19 ℃

在PyQt5中,信号与槽的使用有如下特点

  1. 一个信号可以关联多个槽函数。
  2. 一个信号也可以关联其他信号。
  3. 信号的参数可以是任何Python数据类型。
  4. 一个槽函数可以和多个信号关联。
  5. 关联可以是直接的或排队的。
  6. 可以在不同的线程之间建立关联。
  7. 信号与槽也可以断开关联。
# -*- coding: utf-8 -*-

import sys

from PyQt5.QtCore import QObject, pyqtSlot, pyqtSignal

class Human(QObject):
    # 定义一个带str类型参数的信号
    nameChanged = pyqtSignal(str)

    # overload型信号,两种参数,一种int,一种str
    ageChanged = pyqtSignal([int], [str])

    def __init__(self, name='xxx', age=10, parent=None):
        super().__init__(parent)

    def setAge(self, age):
        self.__age = age
        self.ageChanged.emit(self.__age) # int参数信号

        if age <= 18:
            ageInfo = "你还是一个小孩"
        else:
            ageInfo = "你是一个大人"

        self.ageChanged[str].emit(ageInfo)  #str参数信号

    def setName(self, name):
        self.__name = name
        self.nameChanged.emit(self.__name)

class Responsor(QObject):
    @pyqtSlot(int)
    def do_ageChanged_int(self, age):
        print("你的年龄是:"+str(age))

    @pyqtSlot(str)
    def do_ageChanged_str(self, age):
        print(age)

    def do_nameChanged(self, name):
        print("你好,"+name)

if __name__ == "__main__":
    print("**程序开始**")

    boy = Human()
    resp = Responsor()

    # 信号与槽函数连接
    boy.nameChanged.connect(resp.do_nameChanged) 

    boy.ageChanged.connect(resp.do_ageChanged_int) #缺省参数,int型
    boy.ageChanged[str].connect(resp.do_ageChanged_str)

    print("\n **建立连接后**")
    boy.setAge(20)
    boy.setName("Jake")
最近发表
标签列表