3.3 訊號和槽的建立
阿新 • • 發佈:2022-03-23
一、訊號和槽的建立
1.訊號和槽的介紹
- 每一個QObject物件和所有繼承自QWidget的控制元件(這些都是 QObject 的子物件)都支援訊號與槽機制。
- 當訊號發射時,連線的槽函式將會自動執行。
- 訊號與槽通過object.signal.connect()方法連線。
訊號與槽具有如下特點。
- 一個訊號可以連線多個槽。
- 一個訊號可以連線另一個訊號。
- 訊號引數可以是任何Python型別。
- 一個槽可以監聽多個訊號。
- 訊號與槽的連線方式可以是同步連線,也可以是非同步連線。
- 訊號與槽的連線可能會跨執行緒。
- 訊號可能會斷
示意圖:
API中訊號與槽的更詳細解釋,可以參考官方網站:
2.定義訊號
1> 為QObject物件建立訊號
- 使用pyqtSignal()函式建立一個或多個過載的未繫結的訊號作為類的屬性,訊號只能在QObject的子類中定義
- 訊號必須在類建立時定義,不能在類建立後作為類的屬性動態新增進來。
- 訊號可以傳遞多個引數,並指定訊號傳遞引數的型別,引數型別是 標準的Python資料型別(字串、日期、布林型別、數字、列表、元組和字典)
2> 為控制元件建立訊號 - 為自定義控制元件WinForm建立了一個btnClickedSignal訊號。
class WinForm(QMainWindow): btnClickedSignal=pyqtSignal()
3.操作訊號
- 使用connect()函式可以把訊號繫結到槽函式上
- 使用disconnect()函式可以解除訊號與槽函式的繫結
- 使用emit()函式可以發射訊號
4.訊號與槽的入門應用
1>內建訊號與槽的使用
- 是指在發射訊號時,使用視窗控制元件的函式,而不是自定義的函式。
- 程式碼
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_())
- 效果
2>自定義訊號與槽的使用
- 指在發射訊號時,不使用視窗控制元件的函式,而是使用自定義的函式(簡單地說,就是使用 pyqtSignal 類例項發射訊號)
- 程式碼
"""
【簡介】
內建訊號槽示例
"""
from PyQt5.QtCore import QObject, pyqtSignal
# 訊號物件
class QTypeSignal(QObject) :
# # 定義一個訊號
# sendmsg = pyqtSignal(object)
#定義含有兩個引數的訊號
sendmsg = pyqtSignal(str,str)
def __init__(self) :
super(QTypeSignal, self).__init__()
def run(self) :
# 發射訊號
# # 傳遞一個引數
# self.sendmsg.emit('Hello Pyqt5')
# 傳遞兩個引數
self.sendmsg.emit('第一個引數', '第二個引數')
# 槽物件
class QTypeSlot(QObject) :
def __init__(self) :
super(QTypeSlot, self).__init__()
# 槽物件裡的槽函式
# def get(self, msg) :
# print("QSlot get msg => " + msg)
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()
- 執行結果
3>裝飾器的訊號與槽的使用
- 是第一種的衍生,後面會介紹