这篇文章主要介绍了PyQt5通过信号实现MVC的示例,帮助大家更好的理解和使用pyqt5,感兴趣的朋友可以了解下
众所周知MVC是个好东西。前阵子网上搜了下,但关于用PyQt5实现MVC的中文文档缺少之又少,优质的文档只搜到了一篇。既然这样,来,开个坑,学习新知识,吸引流量。话说,关于PyQt5,布局那里需要好好看看,容器类控件需要好好看看,还有多线程和自动化测试那块。但要写出完美GUI需要大量的代码经验和文档查询的能力。然后,嗯,这部分坑就填完了。
扯回正题:假设此时面临的场景是,一个软件涉及好几个页面,每个页面是单独的代码。且每个页面需要有自己的controller,最终所有的controller汇总到一起,统一管理。
本文中,文字只是辅助理解,务必读懂代码。
信号
众所周知,GUI中当一个控件的状态改变时需要通知另一个控件,也就是实现了对象间的通信。当事件发生或状态改变时,就会发出信号,信号会触发与这个事件相关联的函数,我们这个函数为槽。信号与槽可以是多对多的关系。信号在类创建时定义,即需要在初始化的前面定义。
自定义信号与槽
别问,静静感受以下代码。以下的代码中,已经包含了信号的定义、指定参数的类型、发射、绑定槽函数等一系列过程。
from PyQt5.QtCore import QObject, pyqtSignal
# 信号对象
class QSignal(QObject):
# 定义信号
# 在类创建时定义,不能在类创建后作为类的属性而添加
# 指定信号传递参数的数量,类型等
send_msg = pyqtSignal(str, str)
def __init__(self):
super(QSignal, self).__init__()
def run(self):
# 信号发射
self.send_msg.emit('First arg', 'Second arg')
# 槽对象
class QSlot(QObject):
def __init__(self):
super(QSlot, self).__init__()
def get(self, *args):
# 信号接收
print("Get message =>" + args[0], args[1], sep=', ')
if __name__ == '__main__':
send = QSignal()
slot = QSlot()<