PyQt pyqtSignal 自定义信号实例讲解,多页面信息传递
个人认为pyqtSignal是pyqt里非常实用的一个接口,是 PyQt5 提供的自定义信号类; 其用法比较灵活,特别适合用于多页面之间的信号,信息传递,其继承自QtCore类。
基本用法:
信号传递方法:可以传递的信息,可以说是基本上覆盖了Python的所有数据类型。
pyqtSignal(str) # 传递字符串数据
pyqtSignal(list) # 传递列表数据
pyqtSignal(tuple) # 传递元祖数据
pyqtSignal(dict) # 传递字典数据
其用法可归纳为:
1、定义信号 diy_signal = pyqtSignal(str);
2、信号激发:diy_signal.emit(需传递的数据);
3、接收信号:diy_signal.connect(激发的槽函数)。
可以看出pyqtSignal和pyqt的信号与槽用法非常类似。
都有信号的激发,信号与槽函数的链接过程。如:QPushButton().clicked.connect(click_func)。
只不过其信号相对于按钮的点击而言,为自定义信号。
实例用法:
我们先来试着用pyqtsignal信号来完成以下的需求:
有两个父子页面,当子页面被创建和关闭时,父页面显示子页面状态信息。
完成最终效果:
先创建父页面类:
# 导入模块
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt,pyqtSignal
from PyQt5.QtGui import QFont
# 创建父页面类
class Parents_Widget(QWidget):
def __init__(self):
super(Parents_Widget, self).__init__()
# 页面基础设置
# 设置窗口标题
self.setWindowTitle('父页面')
# 设置页面尺寸
self.resize(500,200)
# 创建Label控件
# 页面标题label
self.label_0 = QLabel('页面间信号传递实例')
# 设置label控件居中
self.label_0.setAlignment(Qt.AlignCenter)
# 设置字体样式
self.label_0.setFont(QFont('宋体',12,QFont.Bold))
self.label_1 = QLabel('子页面状态:')
# 创建单行文本输入框
self.line_1 = QLineEdit()
# 创建按钮
self.create_button = QPushButton('创建子页面')
self.close_button = QPushButton('关闭子页面')
# 按钮初始方法
self.button_init()
# 创建布局管理器
self.h1_layout = QHBoxLayout() # 水平布局管理器
self.h2_layout = QHBoxLayout()
self.v_layout = QVBoxLayout() # 垂直布局管理器
# 页面初始化
self.layout_init()
# 页面布局方法
def layout_init(self):
# 水平布局管理器1
self.h1_layout.addWidget(self.label_1)
self.h1_layout.addWidget(self.line_1)
# 水平布局管理器2
self.h2_layout.addWidget(self.create_button)
self.h2_layout.addWidget(self.close_button)
# 垂直布局管理器
self.v_layout.addStretch(1)
self.v_layout.addWidget(self.label_0)
self.v_layout.addSpacing(10)
self.v_layout.addLayout(self.h1_layout)
self.v_layout.addSpacing(10)
self.v_layout.addLayout(self.h2_layout)
self.v_layout.addStretch(1)
# 设置最终布局
self.setLayout(self.v_layout)
# 按钮初始化方法
def button_init(self):
# 创建子页面按钮点击信号绑定槽函数
self.create_button.clicked.connect(self.create_func)
# 关闭子页面按钮点击信号绑定槽函数
self.close_button.clicked.connect(self.close_func)
# 创建子页面方法
def create_func(self):
# 创建子页面
self.child_widget = Child_Widget()
# 子页面自定义信号绑定显示子页面信息方法
self.child_widget.status_signal.connect(
self.child_widget_info)
# 设置子页面名称
self.child_widget.setWindowTitle('子页面')
self.child_widget.show()
# 子页面关闭方法
def close_func(self):
try:
self.child_widget.close()
self.child_widget.status_signal.connect(self.child_widget_info)
except:
self.line_1.setText('子页面不存在!')
# 子页面信息显示方法
def child_widget_info(self,info):
if info == 'create':
self.line_1.setText('子页面被创建')
elif info == 'close':
self.line_1.setText('子页面被关闭')
代码分析:
1、父页面有两个按钮:创建子页面按钮,关闭子页面按钮。
2、两个按钮点击信号分别绑定创建页面槽函数,关闭子页面槽函数。
3、创建子页面槽函数,创建了子页面,并将子页面的自定义信号status_signal绑定在子页面信息显示方法。当子页面自定义信号激发(emit)时激活子页面信息显示槽函数。
4、关闭子页面槽函数,关闭子页面。
创建子页面类:
# 创建子页面类
class Child_Widget(QWidget):
# 创建自定义子页面状态信号
status_signal = pyqtSignal(str)
def __init__(self):
super(Child_Widget, self).__init__()
# 设定子页面尺寸
self.resize(300,300)
# 设定子页面的窗口名称改变信号与自定义信号连接
self.windowTitleChanged.connect(lambda :
self.status_signal.emit('create'))
# 重写关闭方法,将子页面关闭事件与自定义信号连接
def closeEvent(self, event):
self.status_signal.emit('close')
代码分析:
1、自定义信号:status_signal ,其传输的信息类型为字符串。
2、子页面状态有创建和关闭两种状态,创建状态用子页面标题改变信号来绑定自定义信号。
即:子页面标题从无到有时,自定义信号被激发(emit),并传递 ‘create’ 字符串信息。
3、子页面关闭状态,这里是重写了页面关闭方法。让页面关闭事件绑定自定义信号,当页面关闭时激发信号,并传递 ‘close’ 字符串信号。
实例父页面类,及展示窗口:
if __name__ == '__main__':
page = QApplication(sys.argv)
# 实例父页面
window = Parents_Widget()
window.show()
sys.exit(page.exec())
结尾:
以上就是本次 pyqt5 使用自定义信号 pyqtSignal 来进行页面之间的信息传递的方法及实例讲解。
因本人Python 及 pyqt5 均为视频或者书籍自学,路子可能比较野…。
有讲的不清楚,或者错误之处,欢迎大家留言讨论。也可加本人微信:dw20200318,索要源码,一起学习。