一、信号与槽
信号(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()
标签:__,05,self,emit,信号,Signal,def
From: https://www.cnblogs.com/FlurryHeart/p/18606107