![]() 本篇推文共计1500个字,阅读时间约3分钟。 信号(Signal)和槽(Slot)是Qt编程中对象间通讯的机制。在Qt中,每一个QObject对象,包括PyQt中所有继承自QWidget的控件都支持signal和slot机制。 信号与槽机制作为Qt最重要的特性,提供了任意两个Qt对象之间的通信机制。信号会在某个特定情况或动作下被触发,槽是用于接收并处理信号的函数。 每个Qt对象都包含预定的信号和槽,当某一特定事件发生时,一个信号被发射,与信号相关联的槽则会响应信号同时完成相应的信号处理操作。 ![]() 开发工具版本 1.Pycharm 2019.1.3社区版 ![]() 2.Anaconda(Python 3.6.0,PyQt5) ![]() ![]() 信号与槽的关系 1.信号与槽是多对多的关系,即一个信号可以对应多个槽,一个槽可以对用多个信号。 2.信号与槽的连接方式可以是同步连接,也可以是异步连接。 3.信号和槽的连接可以跨线程。 ![]() 信号与槽的特点 1.一个信号可以与另一个信号相连。 connect(Object1,SIGNAL(signal1),Object2,SIGNAL(signal1)) 即表示Object1的信号1发射可以触发Object2的信号1响应。 2.表示一个信号可以与多个槽相连。 connect(Object1,SIGNAL(signal1),Object2,SLOT(slot2)) connect(Object1,SIGNAL(signal1),Object3,SLOT(slot3)) 即表示Object1的信号1发射可以触发Object2的信号2和Object3的信号3响应。 3.表示同一个槽可以响应多个信号。 connect(Object1,SIGNAL(signal2),Object2,SLOT(slot2)) connect(Object3,SIGNAL(signal3),Object2,SLOT(slot2)) 即表示Object1的信号1和Object3的信号3发射都可以触发Object2的信号2响应。 ![]() ![]() 信号与槽三种使用方法 1.内置信号与槽的使用。 2.自定义信号与槽的使用。 3.装饰器的信号与槽的使用。 01 使用方便,缺点明显,只能发射特定的信号(如按键被点击)。 如下示例代码: import sys 运行之后如下所示: ![]() 点击左侧窗口中的“测试信息按钮”即可出现右侧信息提示框。 在这里用到的信号和槽机制是发射按钮信号时,使用窗口控件的函数,而不是自定义的函数。 02 使用范围最广,用法灵活,相比第一种较难掌握。 首先需要记得自定义信号与槽的三要素: 1.定义信号。 2.定义槽函数。 3.连接信号与槽函数。 如下示例代码: from PyQt5.QtWidgets import QMainWindow, QPushButton , QWidget , QMessageBox, QApplication, QHBoxLayout 运行之后如下所示: ![]() 这里重点解释onButtonClick()函数是怎样处理从两个按钮传来的信号的。这里就是自定义的函数信号。 def onButtonClick(self, n): 使用lambda表达式传递按钮数字给槽函数,当然也可以传递其他任何东西,甚至是按钮控件本身。 button1.clicked.connect(lambda: self.onButtonClick(1)) 03 首先要执行这个函数: # 信号自动连接到槽函数核心代码 槽函数的定义是: @QtCore.pyqtSlot() 完整测试代码: from PyQt5.QtWidgets import * 运行之后如下所示: ![]() 每按一下“点击连接”即可显示一次连接成功。 本文介绍了PyQt5信号与槽最基本的使用方法,让大家知道了如何调用自定义槽函数。掌握了这些基础知识,就可以动手实现一些基本的需求了。 ![]() 看完本文如有任何疑问,可发送疑问至后台,工作人员看到后会第一时间为你解决。 END ![]() 图片|网络 编辑|一个码农 ![]() ![]() 你与世界 只差一个 公众号 喜欢本文的话麻烦你点个“关注”加“在看” 觉得写得不错的话可以点击下方“喜欢作者” 你的支持是我不断前行的动力 ---------------------------------------------------------------------------------------------------------------------- 我们尊重原创,也注重分享,文章来源于微信公众号:看那个码农,建议关注公众号查看原文。如若侵权请联系qter@qter.org。 ---------------------------------------------------------------------------------------------------------------------- |