PyQt5 Signal / Slot 機制入門

利用 Qt Designer 設計好程式的介面以後,要如何讓程式有反應呢?這時候就得寫背後的邏輯了。 Qt 使用 Signal / Slot 機制來達到物件之間的通訊,就有點像是拿電線接起來一樣。例如將開關接上燈泡後,按下開關就會亮,而將連結斷開後,燈泡就不會對按鈕有反應了。

不知道怎麼安裝可以先看這篇
安裝PyQt5 + 連動Pycharm

012

現在我們先設計一個簡易的加法器如下,物件名稱需更改以利辨識

02_1

Qt Designer 右下角有個 Signal/Slot Editor,先按 + 產生一組訊號連結

在 Sender 欄可以選發送訊號的物件,Signal 欄可以選擇觸發條件,Receiver 欄可以選擇接收訊號的物件,Slot 可以選擇執行的動作

02_2

我們希望按下 Clear 按鈕後,三個 lineEdit 框可以被清空,所以設定當 pushButton_clear 被 clicked() 的時候,lineEdit_A 要 clear() 自己的資料

02_3

剩下 lineEdit_B 與 lineEdit_ANS 都比照辦理

現在將圖形介面存檔成adder.ui,並利用 PyUIC 將 adder.ui 轉換成 adder.py

另外寫一個 call_adder.py 來啟動程式:

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from adder import *
 
class AdderMainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(AdderMainWindow, self).__init__(parent)
        self.setupUi(self)
 
if __name__ == "__main__":
    app = QApplication(sys.argv)
    myWin = AdderMainWindow()
    myWin.show()
    sys.exit(app.exec_())
032

執行後可以發現 clear 按鈕可以將裡面的內容清除

但 calculate 按鈕該怎麼寫呢?我們可以先回頭看看 clear 按鈕在 adder.py 裡是怎麼運作的

self.pushButton_clear.clicked.connect(self.lineEdit_A.clear)
self.pushButton_clear.clicked.connect(self.lineEdit_B.clear)
self.pushButton_clear.clicked.connect(self.lineEdit_ANS.clear)

可以看到 pushButton_clear.clicked 連結到 lineEdit_A.clear 上

我們只要自己定義一個 add 的動作,並將它連接到 pushButton_cal.clicked 上就可以了

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from adder import *
 
class AdderMainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(AdderMainWindow, self).__init__(parent)
        self.setupUi(self)
        # 在 __init__ 裡建立新的連結訊號
        self.pushButton_cal.clicked.connect(self.add)
 
    # 定義 add 動作內容
    def add(self):
        a = self.lineEdit_A.text()
        b = self.lineEdit_B.text()
        ans = float(a) + float(b)
        self.lineEdit_ANS.setText(str(ans))
 
if __name__ == "__main__":
    app = QApplication(sys.argv)
    myWin = AdderMainWindow()
    myWin.show()
    sys.exit(app.exec_())

這樣一來 calculate 按鈕也能正常運作了


發表迴響