Pyqt/Qt訊號與槽的理解(一)
阿新 • • 發佈:2019-01-04
訊號與槽有三種使用方法:內建訊號與槽,自定義訊號與槽和裝飾器的訊號與槽。
內建訊號與槽
內建訊號與槽是指在發射訊號時,使用視窗控制元件的函式,而不是自定義的函式,可通過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()