1. 程式人生 > >Pyqt/Qt訊號與槽的理解(一)

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()