信号与槽有三种使用方法:内置信号与槽,自定义信号与槽和装饰器的信号与槽。
内置信号与槽
内置信号与槽是指在发射信号时,使用窗口控件的函数,而不是自定义的函数,可通过QObject.signal.connect
将一个QObject
的信号连接到另一个QObject
的槽函数。
from PyQt5.QtWidgets import QPushButton , QApplication, QWidget
from PyQt5.QtWidgets import QMessageBox
import sys
app = QApplication(sys.argv)
widget = QWidget()
def showMsg():
QMessageBox.information(widget, "信息提示框", "ok,弹出测试信息")
btn = QPushButton( "测试点击按钮", widget)
btn.clicked.connect( showMsg)
widget.show()
sys.exit(app.exec_())
运行结果:
自定义的信号与槽的使用
传递一个参数
自定义的信号与槽的使用是指在发射信号时,不使用窗口控件的函数,而是使用自定义的函数,即pyqtSignal类实例发射信号,以下为Python风格的信号与槽的写法:
from PyQt5.QtCore import QObject, pyqtSignal
# 信号对象
class QTypeSignal(QObject):
# 定义一个信号
sendmsg = pyqtSignal(object)
def __init__(self):
super(QTypeSignal, self).__init__()
def run(self):
# 发射信号
self.sendmsg.emit('Hello Pyqt5')
# 槽对象
class QTypeSlot(QObject):
def __init__(self):
super(QTypeSlot, self).__init__()
# 槽对象里的槽函数
def get(self, msg):
print("QSlot get msg => " + msg)
if __name__ == '__main__':
send = QTypeSignal()
slot = QTypeSlot()
# 1
print('--- 把信号绑定到槽函数 ---')
send.sendmsg.connect(slot.get)
send.run()
# 2
print('--- 把信号断开槽函数 ---')
send.sendmsg.disconnect(slot.get)
send.run()
运行结果:
信号与槽的连接步骤
1. 生成信号
sendmsg = pyqtSignal(object)
2. 将信号与槽函数绑定起来
send.sendmsg.connect(slot.get)
3. 槽函数接收数据
def get(self, msg):
print("QSlot get msg => " + msg)
4. 发射信号的实现
self.sendmsg.emit('Hello Pyqt5')
5. 将信号绑定到槽对象中的槽函数get()上
故槽函数可以接收到所发射的信号—-字符串“Hello Pyqt5”
。
send = QTypeSignal()
slot = QTypeSlot()
print('--- 把信号绑定到槽函数 ---')
send.sendmsg.connect(slot.get)
send.run()
同理,断开信号与槽函数get()
的连接,则槽函数肯定就接收不到信号了。
print('--- 把信号断开槽函数 ---')
send.sendmsg.disconnect(slot.get)
send.run()
传递两个参数
只需修改下代码即可:
from PyQt5.QtCore import QObject , pyqtSignal
#信号对象
class QTypeSignal(QObject):
#定义一个信号
sendmsg = pyqtSignal( str,str)
def __init__( self):
super( QTypeSignal, self).__init__()
def run( self):
# 发射信号
self.sendmsg.emit('第一个参数','第二个参数')
# 槽对象
class QTypeSlot(QObject):
def __init__( self):
super( QTypeSlot, self).__init__()
# 槽对象里的槽函数
def get(self, msg1, msg2):
print("QSlot get msg => " + msg1 + ' ' + msg2)
if __name__ == '__main__':
send = QTypeSignal()
slot = QTypeSlot()
#1
print('--- 把信号绑定到槽函数 ---')
send.sendmsg.connect( slot.get)
send.run()
#2
print('--- 把信号断开槽函数 ---')
send.sendmsg.disconnect( slot.get )
send.run()