1. 程式人生 > 其它 >3.3 訊號和槽的建立

3.3 訊號和槽的建立

一、訊號和槽的建立

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>裝飾器的訊號與槽的使用

  • 是第一種的衍生,後面會介紹