Pyqt/Qt信号与槽的理解(一)

信号与槽有三种使用方法:内置信号与槽,自定义信号与槽和装饰器的信号与槽。

内置信号与槽

内置信号与槽是指在发射信号时,使用窗口控件的函数,而不是自定义的函数,可通过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()   

猜你喜欢

转载自blog.csdn.net/zhangziju/article/details/80251433