PyQt5中的pyqtsignal,是一个非常有用的类,可以帮助python程序实现消息发送和消息接收,即实现事件机制。如果你在使用pyqtsignal中过程中无法捕获消息,那一定是没有领悟到pyqtsignal的使用要领。
要领:
【1】pyqtSignal对象必须定义在继承自QObject的类中;
【2】pyqtSignal对象作为类级别变量存在;
【3】该类的初始化方法中必须调用父类的初始化方法。
代码如下:
# 【1】信号发生类,必须继承自QObject类
class message_sender(QObject):
# 【2】pyqtSignal对象必须以类变量的形式存在,在此定义
signal = pyqtSignal(str)
# 【3】必须调用父类初始化,否则无法使用pyqtSignal
def __init__(self):
super().__init__()
# 【4】发送信号
def work(self):
self.signal.emit("开始工作")
pyqtSignal使用总结:
- pyqtSignal对象对定义环境有要求;
- 对信号接收环境没要求(即普通方法,类方法,类是否继承PyQt类都没要求);
- 对运行环境没要求(即console,Qt环境都可以)
完整示例代码如下:
import sys
from PyQt5 import QtWidgets
from PyQt5.QtCore import pyqtSignal, QObject
'''
pyqtSiganl使用总结:
pyqtSiganl对象对定义环境有要求;
对信号接收环境没要求(即普通方法,类方法,类是否继承PyQt类都没要求);
对运行环境没要求(即console,Qt环境都可以)
'''
# 【1】信号发生类,必须继承自QObject类
class message_sender(QObject):
# 【2】pyqtSignal对象必须以类变量的形式存在,在此定义
signal = pyqtSignal(str)
# 【3】必须调用父类初始化,否则无法使用pyqtSignal
def __init__(self):
super().__init__()
# 【4】发送信号
def work(self):
self.signal.emit("开始工作")
# 【5】可用普通的方法接收信号
def callback(msg):
print("收到信号:" + msg)
# 【6】也可以在类的方法中接收信号,无需继承PyQt类
class message_receiver():
def __init__(self):
super().__init__()
def callback(self,msg):
print("收到信号:"+msg)
def work(self):
sender=message_sender()
sender.signal.connect(self.callback)
sender.work()
if __name__ == '__main__':
# 示例1:在python的cosole工作模式下,利用普通方法接收信号
sender=message_sender()
sender.signal.connect(callback)
sender.work()
# # 示例2:在python的cosole工作模式下,利用对象方法接收信号
# receiver=message_receiver()
# receiver.work()
#
# # 示例3:在python的Qt工作模式下,利用普通方法接收信号
# app = QtWidgets.QApplication(sys.argv)
# sender=message_sender()
# sender.signal.connect(callback)
# sender.work()
# sys.exit(app.exec_())
#
# # 示例4:在python的Qt工作模式下,利用普通方法接收信号
# app = QtWidgets.QApplication(sys.argv)
# receiver=message_receiver()
# receiver.work()
# sys.exit(app.exec_())