信号(singal)与槽(slot)用于对象相互通信,信号:当某个对象的某个事件发生时,触发一个信号,槽:响应指定信号的所做的反应,其实信号槽类似于.NET里面的委托、事件,比如Repeater控件类,当行数据绑定后,触发一个ItemDataBound事件,不管使用者使用会监听该事件并做额外处理,其控件类内部都会触发该事件,这种机制很多程度提高了类的封装性和完整性。
  PyQt的窗体控件类已经有很多的内置信号,开发者也可以添加自己的自定义信号,信号槽有如下特点:
    - 一个信号可以连接到许多插槽。
    - 一个信号也可以连接到另一个信号。
    - 信号参数可以是任何Python类型。
    - 一个插槽可以连接到许多信号。
    - 连接可能会直接(即同步)或排队(即异步)。
    - 连接可能会跨线程。
    - 信号可能会断开

  (以上几条特点翻译于官方文档),接下来,我将以若干个实例,来体现以上几个特点。

内置信号槽的使用

[python] view plaincopy
  1. from PyQt5.QtWidgets import *
  2. from PyQt5.QtCore import *
  3. def sinTest():
  4. btn.setText("按钮文本改变")
  5. app = QApplication([])
  6. main = QWidget()
  7. main.resize(200,100)
  8. btn = QPushButton("按钮文本",main)
  9. ##按钮btn的内置信号连接名为sinTest的槽
  10. btn.clicked.connect(sinTest)
  11. main.show()
  12. app.exec_()

自定义信号槽的使用

[python] view plaincopy
  1. class SinClass(QObject):
  2. ##声明一个无参数的信号
  3. sin1 = pyqtSignal()
  4. ##声明带一个int类型参数的信号
  5. sin2 = pyqtSignal(int)
  6. ##声明带一个int和str类型参数的信号
  7. sin3 = pyqtSignal(int,str)
  8. ##声明带一个列表类型参数的信号
  9. sin4 = pyqtSignal(list)
  10. ##声明带一个字典类型参数的信号
  11. sin5 = pyqtSignal(dict)
  12. ##声明一个多重载版本的信号,包括了一个带int和str类型参数的信号,以及带str参数的信号
  13. sin6 = pyqtSignal([int,str], [str])
  14. def __init__(self,parent=None):
  15. super(SinClass,self).__init__(parent)
  16. ##信号连接到指定槽
  17. self.sin1.connect(self.sin1Call)
  18. self.sin2.connect(self.sin2Call)
  19. self.sin3.connect(self.sin3Call)
  20. self.sin4.connect(self.sin4Call)
  21. self.sin5.connect(self.sin5Call)
  22. self.sin6[int,str].connect(self.sin6Call)
  23. self.sin6[str].connect(self.sin6OverLoad)
  24. ##信号发射
  25. self.sin1.emit()
  26. self.sin2.emit(1)
  27. self.sin3.emit(1,"text")
  28. self.sin4.emit([1,2,3,4])
  29. self.sin5.emit({"name":"codeio","age":"25"})
  30. self.sin6[int,str].emit(1,"text")
  31. self.sin6[str].emit("text")
  32. def sin1Call(self):
  33. print("sin1 emit")
  34. def sin2Call(self,val):
  35. print("sin2 emit,value:",val)
  36. def sin3Call(self,val,text):
  37. print("sin3 emit,value:",val,text)
  38. def sin4Call(self,val):
  39. print("sin4 emit,value:",val)
  40. def sin5Call(self,val):
  41. print("sin5 emit,value:",val)
  42. def sin6Call(self,val,text):
  43. print("sin6 emit,value:",val,text)
  44. def sin6OverLoad(self,val):
  45. print("sin6 overload emit,value:",val)
  46. sin = SinClass()

运行结果:
sin1 emit
sin2 emit,value: 1
sin3 emit,value: 1 text
sin4 emit,value: [1, 2, 3, 4]
sin5 emit,value: {'age': '25', 'name': 'codeio'}
sin6 emit,value: 1 text
sin6 overload emit,value: text

信号槽N对N连接、断开连接

[python] view plaincopy
  1. from PyQt5.QtWidgets import *
  2. from PyQt5.QtCore import *
  3. class SinClass(QObject):
  4. ##声明一个无参数的信号
  5. sin1 = pyqtSignal()
  6. ##声明带一个int类型参数的信号
  7. sin2 = pyqtSignal(int)
  8. def __init__(self,parent=None):
  9. super(SinClass,self).__init__(parent)
  10. ##信号sin1连接到sin1Call和sin2Call这两个槽
  11. self.sin1.connect(self.sin1Call)
  12. self.sin1.connect(self.sin2Call)
  13. ##信号sin2连接到信号sin1
  14. self.sin2.connect(self.sin1)
  15. ##信号发射
  16. self.sin1.emit()
  17. self.sin2.emit(1)
  18. ##断开sin1、sin2信号与各槽的连接
  19. self.sin1.disconnect(self.sin1Call)
  20. self.sin1.disconnect(self.sin2Call)
  21. self.sin2.disconnect(self.sin1)
  22. ##信号sin1和sin2连接同一个槽sin1Call
  23. self.sin1.connect(self.sin1Call)
  24. self.sin2.connect(self.sin1Call)
  25. ##信号再次发射
  26. self.sin1.emit()
  27. self.sin2.emit(1)
  28. def sin1Call(self):
  29. print("sin1 emit")
  30. def sin2Call(self):
  31. print("sin2 emit")
  32. sin = SinClass()

运行结果:
sin1 emit
sin2 emit
sin1 emit
sin2 emit
sin1 emit
sin1 emit

多线程信号槽通信

[python] view plaincopy
  1. from PyQt5.QtWidgets import *
  2. from PyQt5.QtCore import *
  3. class Main(QWidget):
  4. def __init__(self, parent = None):
  5. super(Main,self).__init__(parent)
  6. ##创建一个线程实例并设置名称、变量、信号槽
  7. self.thread = MyThread()
  8. self.thread.setIdentity("thread1")
  9. self.thread.sinOut.connect(self.outText)
  10. self.thread.setVal(6)
  11. def outText(self,text):
  12. print(text)
  13. class MyThread(QThread):
  14. sinOut = pyqtSignal(str)
  15. def __init__(self,parent=None):
  16. super(MyThread,self).__init__(parent)
  17. self.identity = None
  18. def setIdentity(self,text):
  19. self.identity = text
  20. def setVal(self,val):
  21. self.times = int(val)
  22. ##执行线程的run方法
  23. self.start()
  24. def run(self):
  25. while self.times > 0 and self.identity:
  26. ##发射信号
  27. self.sinOut.emit(self.identity+" "+str(self.times))
  28. self.times -= 1
  29. app = QApplication([])
  30. main = Main()
  31. main.show()
  32. app.exec_()

运行结果:
thread1 6
thread1 5
thread1 4
thread1 3
thread1 2
thread1 1

PyQt5学习笔记13----pyqt线程间通信相关推荐

  1. Vue学习笔记三(组件间通信)

    主要通信方式包括: 1.props属性 父---->子,子传父也可以通过方法实现,传递的可以是一个数据对象,或者一个方法,是方法的时候子组件调用该方法,通过传参方式将数据传递给父组件. < ...

  2. Python入门学习笔记13(线程锁与信号量)

    锁的作用是在多个线程访问同一个资源时对资源进行保护,防止多线程操作造成结果不解预测 1.互斥锁 import threadingnum = 0mutex = threading.Lock();def ...

  3. Eric6与pyqt5学习笔记13 【实战4 打造局域网远控软件】

    已经去集训营安心准备考研了,这两天回校参加夏令营,顺便把之前3天课设做的一个小软件写个博客分享下~ 不知道有没有也是今年考研的研友呢,祝大家都能考上理想的研究生!!! 远控软件思路 远控软件基本功能我 ...

  4. Java多线程编程-(4)-线程间通信机制的介绍与使用

    上一篇: Java多线程编程-(1)-线程安全和锁Synchronized概念 Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性 Java多线程编程-(3)-线程本地Th ...

  5. Disruptor本地线程队列_实现线程间通信---线程间通信工作笔记001

    Disruptor本地线程队列_实现线程间通信---线程间通信工作笔记001 看到同事用这个东西了,这个挺好用的说是,可以实现,本地线程间的通信,好像在c++和java中都可以用 现在没时间研究啊,暂 ...

  6. android线程间通信的几种方法_Android 技能图谱学习路线

    Java基础 Java Object类方法 HashMap原理,Hash冲突,并发集合,线程安全集合及实现原理 HashMap 和 HashTable 区别 HashCode 作用,如何重载hashC ...

  7. 【java笔记】线程间通信(2):生产者和消费者案例分析

    [java笔记]线程间通信(1):等待唤醒机制_m0_52043808的博客-CSDN博客 类: 资源类:包子类:皮,馅,有无 生产者: 包子铺类(线程类)(继承Thread) 设置线程任务(run) ...

  8. Java基础学习——多线程(线程间通信-生产者消费者代码示例)

    JDK 1.5提供了多线程升级方案 将同步synchronized替换成了显示的Lock操作.可以实现唤醒.冻结指定的线程. Lock接口 Lock 实现提供了比使用 synchronized 方法和 ...

  9. ios开发笔记之 线程间通信

    performSelectorOnMainThread:selector:waitUntilDone: 用于线程间通信 使两个线程同步或者时异步执行. block阻塞 转载于:https://www. ...

  10. 【java笔记】线程间通信(1):等待唤醒机制

    线程间通信概念:多个线程处理同一个资源,但是处理的动作却不相同 必要性:多个线程并发执行时,在默认情况下CPU是随机切换线程的,当需要多个线程来共同完成一件任务,并且希望它们有规律的执行,那么多线程之 ...

最新文章

  1. RSA公私钥加解密方式-工具类
  2. 新文速递 | 盒装数据:一种基于数据盒的数据产品形态
  3. 线性表:顺序队列算法实现
  4. 计算机做镜像步骤,如何将当前的操作系统做成镜像?
  5. Logic Pro for Mac(音频制作软件)V10.6.2中文版 支持M1芯片版mac
  6. 20、淘宝技术这十年
  7. Nsight Compute与nvprof metrics 对照
  8. 呼和浩特市啥时计算机考试,2021上半年内蒙古自治区呼和浩特市全国计算机等级考试时间...
  9. CuteFTP试用期后继续免费使用
  10. 专题页汇聚seo流量的葵花宝典
  11. 史上最简单的Map转List的方式
  12. ANSYS 入门教程 (1) - ANSYS 与结构分析
  13. 掉队于云计算市场是甲骨文裁员的最大原因
  14. ios 内存深度优化_iPhone 6要用1GB内存 优化太好还是另有玄机?
  15. 软件测试人员必备的60个测试工具,果断收藏了!
  16. 一,EAIDK-310开箱
  17. App中快速复用微信登录授权的一种方法
  18. 丸子小程序打通视频号,变现更便捷~
  19. 关于SIGSEGV错误及处理方法
  20. 网络基础之基于距离矢量的动态路由(RIP)

热门文章

  1. 计算机扩展卡,对于电脑来说, 扩展卡是什么?与接口又有什么关系呢?
  2. cad方格网高程lisp编程_分享:方格网法土方工程量计算实例例题(疏浚清淤工程)...
  3. C\C++不经意间留下的知识空白------有符号数和无符号数
  4. 图片压缩但质量不减,这个工具很不错
  5. ae可围绕帧拖动放大插件:Drag Zoom Pro for AE mac(兼容M1)
  6. 适用所有服务器的全站301重定向跳转教程
  7. lightroom手机版下载_vnc控制手机版下载,vnc控制手机版下载的使用教程
  8. qt5 窗体显示完毕信号_iPhone手机信号不好?试试这样设置,随时随地让你的手机信号满格...
  9. RTX5 | STM32H743+CubeMX+RTX5+两路FDCAN模板
  10. C++学习之Dev-C++安装与调试