05. 信号与槽

一、信号与槽

  信号(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()
posted @   星光映梦  阅读(85)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示