本文共 2500 字,大约阅读时间需要 8 分钟。
PyQt的窗口控件类中有很多内置信号,开发者也可以添加自定义信号。在编写一个类时,要先定义该类的信号与槽,在类中信号与槽连接,实现对象之间的数据传输。信号与槽具有如下特点:
- 一个信号可以连接多个槽;
- 一个信号可以连接另一个信号;
- 信号参数可以是任何Python类型;
- 一个槽可以监听多个信号;
- 信号与槽的连接方式可以是同步连接,也可以是异步连接;
- 信号与槽的连接可能会跨线程;
- 信号可能会断开。
-使用pyqtSignal()函数创建一个或多个重载的未绑定的信号作为类的属性,信号只能在QObject的子类中定义。-信号必须在类创建时定义,不能在类创建后作为类的属性动态添加进来。-使用pyqtSignal()函数创建信号时,信号可以传递多个参数,并指定信号传递参数的类型,参数类型是标准的Python数据类型(字符串、日期、布尔类型、数字、列表、元组和字典)。
from PyQt5.QtCore import *from PyQt5.QtWidgets import *class WinForm(QMainWindow): btnClickedSignal = pyqtSignal()#为自定义控件WinForm创建了一个btnClickedSignal信号
connect()
函数可以把信号绑定到槽函数上;disconnect()
函数可以解除信号与槽函数的绑定;emit()
函数可以发射信号。import sysfrom PyQt5 import QtCorefrom PyQt5.QtWidgets import *from PyQt5.QtGui import *from PyQt5.QtCore import *app = QApplication([])form = QWidget()def showMsg(): QMessageBox.information(form,"信息提示框","ok,弹出测试信息")btn = QPushButton('测试点击按钮',form)#将信号与槽绑定,clicked为内置信号,单击按钮会出现提示框btn.clicked.connect(showMsg)form.show()sys.exit(app.exec_())
运行效果如下:
import sysfrom PyQt5 import QtCorefrom PyQt5.QtWidgets import *from PyQt5.QtGui import *from PyQt5.QtCore import *#信号对象class QTypeSignal(QObject): #生成一个信号 sendmsg = pyqtSignal(object) def __init__(self): super().__init__() def run(self): #发射信号 self.sendmsg.emit('Hello Python')#槽对象class QTypeSlot(QObject): def __init__(self): super().__init__() #槽函数接收数据 def get(self,msg): print("QSlot get message => "+ msg)if __name__ == "__main__": send = QTypeSignal() slot = QTypeSlot() print('将信号绑定槽:') #将信号绑定到槽函数上 send.sendmsg.connect(slot.get) send.run() print('将信号与槽断开') #将信号与槽函数的连接断开 send.sendmsg.disconnect(slot.get) send.run()
运行效果如下:
import sysfrom PyQt5 import QtCorefrom PyQt5.QtWidgets import *from PyQt5.QtGui import *from PyQt5.QtCore import *#信号对象class QTypeSignal(QObject): #生成一个信号 sendmsg = pyqtSignal(str,str) def __init__(self): super().__init__() def run(self): #发射信号 self.sendmsg.emit('第一个参数','第二个参数')#槽对象class QTypeSlot(QObject): def __init__(self): super().__init__() #将槽函数接收数据 def get(self,msg1,msg2): print("QSlot get message => "+ msg1 + ' ' + msg2)if __name__ == "__main__": send = QTypeSignal() slot = QTypeSlot() print('将信号绑定槽:') #将信号绑定到槽函数上 send.sendmsg.connect(slot.get) send.run() print('将信号与槽断开') #将信号与槽函数的连接断开 send.sendmsg.disconnect(slot.get) send.run()
运行效果如下:
转载地址:http://bxozi.baihongyu.com/