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

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

Qt Designer 右下角有個 Signal/Slot Editor,先按 + 產生一組訊號連結
在 Sender 欄可以選發送訊號的物件,Signal 欄可以選擇觸發條件,Receiver 欄可以選擇接收訊號的物件,Slot 可以選擇執行的動作

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

剩下 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_())

執行後可以發現 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 按鈕也能正常運作了