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 sys
from PyQt5 import QtCore
from 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 sys
from PyQt5 import QtCore
from 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 sys
from PyQt5 import QtCore
from 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()
运行效果如下: