【python】PyQt5信号与槽原理剖析与应用实战

06-28 1038阅读

【python】PyQt5信号与槽原理剖析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑

🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。

🏆《博客》:Python全栈,前后端开发,小程序开发,云原生K8S,人工智能,js逆向,App逆向,网络系统安全,数据分析,PyQt5,tkinter,Django,fastapi,flask等框架,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:PyQt5桌面应用开发,零基础到进阶应用实战

景天的主页:景天科技苑

文章目录

  • PyQt5信号与槽
    • 信号与槽介绍
    • 信号与槽机制解读
    • 信号处理API与应用场景
    • destroyed信号
    • objectNameChanged信号
    • disconnect信号
    • widget.blockSignals(bool)
    • widget.signalsBlocked()
    • widget.receivers(信号)
    • 信号处理综合案例

      PyQt5信号与槽

      信号与槽介绍

      信号(Signal)与槽(Slot)是Qt中的核心机制,也是在PyQt编程中对象之间进行通信的机制。PyQt的窗口控件类有很多内置信号,开发者也可以添加自定义信号。信号与槽有如下特点:

      一个信号可以连接多个槽。

      一个信号可以连接另一个信号。

      信号参数可以使任何Python类型。

      一个槽可以连接到多个信号。

      信号与槽的连接方式可以是同步连接,也可以是异步连接。

      信号与槽的连接可能会跨线程。

      信号可以断开连接。

      信号与槽机制解读

      【python】PyQt5信号与槽原理剖析与应用实战

      【python】PyQt5信号与槽原理剖析与应用实战

      信号处理API与应用场景

      【python】PyQt5信号与槽原理剖析与应用实战

      PyQt5内置的一些信号

      【python】PyQt5信号与槽原理剖析与应用实战

      destroyed信号

      当监听到对象销毁时触发槽函数

      from PyQt5.Qt import *
      class Window(QWidget):
          def __init__(self):
              super().__init__()
              self.setWindowTitle("QObject的学习")
              self.resize(500, 500)
              self.setup_ui()
          def setup_ui(self):
              self.QObject信号的操作()
          def QObject信号的操作(self):
              self.obj = QObject()
              # obj.destroyed
              # obj.objectNameChanged
              #槽函数的参数用来接收对象,用来表明哪个对象被释放了
              def destroy_cao(obj):
                  print("对象被释放了", obj)
              #内置信号destroyed,释放信号
              self.obj.destroyed.connect(destroy_cao)
              del self.obj
      if __name__ == '__main__':
          import sys
          app = QApplication(sys.argv)
          window = Window()
          window.show()
          sys.exit(app.exec_())
      

      运行

      【python】PyQt5信号与槽原理剖析与应用实战

      objectNameChanged信号

      当监听到对象名发生了改变时触发

      def QObject信号的操作(self):
          self.obj = QObject()
          #槽函数可以接收参数,此时的参数是改变后的ObjectName
          def obj_name_cao(name):
              print("对象名称发生了改变", name)
          def obj_name_cao2(name):
              print("对象名称发生了改变2", name)
          self.obj.objectNameChanged.connect(obj_name_cao)
          self.obj.objectNameChanged.connect(obj_name_cao2)
          #改变ObjectName
          self.obj.setObjectName("xxx")
      

      运行,两个槽函数都被触发

      【python】PyQt5信号与槽原理剖析与应用实战

      disconnect信号

      取消链接信号与槽

      当我们设置了两次objectname改变,槽函数会执行两次

      【python】PyQt5信号与槽原理剖析与应用实战

      在第二次改变之前,我们使用disconnect。

      我们发现,第二次信号没有触发槽的执行

      【python】PyQt5信号与槽原理剖析与应用实战

      def QObject信号的操作(self):
          self.obj = QObject()
          #槽函数可以接收参数,此时的参数是改变后的ObjectName
          def obj_name_cao(name):
              print("对象名称发生了改变", name)
          def obj_name_cao2(name):
              print("对象名称发生了改变2", name)
          self.obj.objectNameChanged.connect(obj_name_cao)
          self.obj.objectNameChanged.connect(obj_name_cao2)
          #改变ObjectName
          #当我们设置了两次objectname改变,槽函数会执行两次
          self.obj.setObjectName("xxx")
          #当我们使用disconnect,取消了信号与槽的连接,ObjectName发生快乐改变,也不会触发槽函数的执行
          self.obj.objectNameChanged.disconnect()
          self.obj.setObjectName("xxoo")
      

      widget.blockSignals(bool)

      通过传递的布尔参数,可以临时(阻断/恢复)指定控件所有的信号与槽的连接

      传递True,表示临时阻断信号与槽的连接

      传递False,表示临时恢复信号与槽的连接

      def QObject信号的操作(self):
          self.obj = QObject()
          #槽函数可以接收参数,此时的参数是改变后的ObjectName
          def obj_name_cao(name):
              print("对象名称发生了改变", name)
          def obj_name_cao2(name):
              print("对象名称发生了改变2", name)
          self.obj.objectNameChanged.connect(obj_name_cao)
          self.obj.objectNameChanged.connect(obj_name_cao2)
          #改变ObjectName
          #当我们设置了两次objectname改变,槽函数会执行两次
          self.obj.setObjectName("xxx")
          #当我们使用disconnect,取消了信号与槽的连接,ObjectName发生快乐改变,也不会触发槽函数的执行
          # self.obj.objectNameChanged.disconnect()
          #通过blockSignals(True)阻断信号与槽连接,下面的信号未触发槽函数执行
          self.obj.blockSignals(True)
          self.obj.setObjectName("xxoo")
      

      信号被阻断后,第二个槽函数未执行

      【python】PyQt5信号与槽原理剖析与应用实战

      obj.blockSignals(False)

      继续保持信号与槽的连接

      【python】PyQt5信号与槽原理剖析与应用实战

      widget.signalsBlocked()

      获取信号是否被阻止,被阻止返回True,没被组织返回False

      def QObject信号的操作(self):
          self.obj = QObject()
          #槽函数可以接收参数,此时的参数是改变后的ObjectName
          def obj_name_cao(name):
              print("对象名称发生了改变", name)
          def obj_name_cao2(name):
              print("对象名称发生了改变2", name)
          self.obj.objectNameChanged.connect(obj_name_cao)
          self.obj.objectNameChanged.connect(obj_name_cao2)
          #改变ObjectName
          #当我们设置了两次objectname改变,槽函数会执行两次
          self.obj.setObjectName("xxx")
          #当我们使用disconnect,取消了信号与槽的连接,ObjectName发生快乐改变,也不会触发槽函数的执行
          # self.obj.objectNameChanged.disconnect()
          #通过blockSignals(True)阻断信号与槽连接,下面的信号未触发槽函数执行
          self.obj.blockSignals(True)
          #获取信号是否被阻止
          print("信号是否被阻止",self.obj.signalsBlocked())
          #继续保持信号与槽的连接
          # self.obj.blockSignals(False)
          self.obj.setObjectName("xxoo")
      

      【python】PyQt5信号与槽原理剖析与应用实战

      widget.receivers(信号)

      查看信号连接槽的数量

      print("信号连接槽的数量",self.obj.receivers(self.obj.objectNameChanged))
      

      【python】PyQt5信号与槽原理剖析与应用实战

      信号处理综合案例

      1. 当用户点击按钮的时候, 打印"点我嘎哈?"
      from PyQt5.Qt import *
      class Window(QWidget):
          def __init__(self):
              super().__init__()
              self.setWindowTitle("QObject的学习")
              self.resize(500, 500)
              self.setup_ui()
          def setup_ui(self):
              self.QObject信号的操作()
          def QObject信号的操作(self):
       
              # *************信号与槽案例***************开始
              btn = QPushButton(self)
              btn.setText("点击我")
              def cao():
                  print("点我嘎哈?")
              btn.clicked.connect(cao)
              # *************信号与槽案例***************结束
      if __name__ == '__main__':
          import sys
          app = QApplication(sys.argv)
          window = Window()
          window.show()
          sys.exit(app.exec_())
      

      运行

      【python】PyQt5信号与槽原理剖析与应用实战

      1. 在所有修改的窗口标题前, 添加前缀"景天-"
      def 信号与槽():
          # 连接窗口标题变化的信号  与  槽
          #通过传递参数获取修改后的标题
          def cao(title):
              # print("窗口标题变化了", title)
              # window.windowTitleChanged.disconnect()
              #设置信号与槽断开,防止出现递归死循环
              window.blockSignals(True)
              window.setWindowTitle("景天-" + title)
              #恢复信号与槽连接,方便后续再次修改时,能触发槽函数
              window.blockSignals(False)
              # window.windowTitleChanged.connect(cao)
          #标题变化信号
          window.windowTitleChanged.connect(cao)
          window.setWindowTitle("Hello Sz")
          # window.setWindowTitle("Hello Sz2")
          # window.setWindowTitle("Hello Sz3")
      if __name__ == '__main__':
          import sys
          app = QApplication(sys.argv)
          # window = Window()
          #测试信号与槽案例,重新创建个窗口
          window = QWidget()
          信号与槽()
          window.show()
          sys.exit(app.exec_())
      

      运行

      【python】PyQt5信号与槽原理剖析与应用实战

      多次修改,也可以

      【python】PyQt5信号与槽原理剖析与应用实战

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]