PyQt5 - 訊號與槽



與以順序方式執行的控制檯模式應用程式不同,基於 GUI 的應用程式是事件驅動的。函式或方法是響應使用者操作(例如單擊按鈕、從集合中選擇專案或滑鼠單擊等,稱為事件)而執行的。

用於構建 GUI 介面的控制元件充當此類事件的來源。每個從 QObject 類派生的 PyQt 控制元件都設計為響應一個或多個事件發出“訊號”。訊號本身不執行任何操作。相反,它連線到一個“槽”。槽可以是任何可呼叫的 Python 函式

使用 Qt Designer 的訊號/槽編輯器

首先設計一個帶有 LineEdit 控制元件和 PushButton 的簡單表單。

Slot Editor

如果按下按鈕,則需要清除文字框的內容。QLineEdit 控制元件為此目的具有 clear() 方法。因此,按鈕的clicked 訊號需要連線到文字框的clear() 方法。

首先,從“編輯”選單中選擇“編輯訊號/槽”(或按 F4)。然後用滑鼠突出顯示按鈕並將游標拖動到文字框。

Cursor

釋放滑鼠後,將顯示一個對話方塊,其中顯示按鈕的訊號和槽的方法。選擇 clicked 訊號和 clear() 方法。

Clear Method

右下角的訊號/槽編輯器視窗將顯示結果:

Editor Window

儲存 ui 檔案並根據以下程式碼從 ui 檔案構建和生成 Python 程式碼:

pyuic5 -x signalslot.ui -o signalslot.py

生成的 Python 程式碼將透過以下語句建立訊號和槽之間的連線:

self.pushButton.clicked.connect(self.lineEdit.clear)

執行 signalslot.py 並在 LineEdit 中輸入一些文字。如果按下按鈕,文字將被清除。

構建訊號-槽連線

無需使用 Designer,您可以直接使用以下語法建立訊號-槽連線:

widget.signal.connect(slot_function)

假設在單擊按鈕時要呼叫一個函式。在這裡,clicked 訊號需要連線到一個可呼叫的函式。可以使用以下任何一種技術來實現:

button.clicked.connect(slot_function)

示例

在下面的示例中,兩個 QPushButton 物件(b1 和 b2)被新增到 QDialog 視窗中。我們希望在分別單擊 b1 和 b2 時呼叫函式 b1_clicked() 和 b2_clicked()。

當單擊 b1 時,clicked() 訊號連線到 b1_clicked() 函式:

b1.clicked.connect(b1_clicked())

當單擊 b2 時,clicked() 訊號連線到 b2_clicked() 函式。

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

def window():
   app = QApplication(sys.argv)
   win = QDialog()
   b1 = QPushButton(win)
   b1.setText("Button1")
   b1.move(50,20)
   b1.clicked.connect(b1_clicked)
   
   b2 = QPushButton(win)
   b2.setText("Button2")
   b2.move(50,50)
   b2.clicked.connect(b2_clicked)
   
   win.setGeometry(100,100,200,100)

   win.setWindowTitle("PyQt5")
   win.show()
   sys.exit(app.exec_())

def b1_clicked():
   print ("Button 1 clicked")

def b2_clicked():
   print ("Button 2 clicked")

if __name__ == '__main__':
   window()

以上程式碼產生以下輸出:

PushButton

輸出

Button 1 clicked
Button 2 clicked
廣告