利用 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 來啟動程式:
<pre class="brush: python; title: ; notranslate" title="">
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 裡是怎麼運作的
<pre class="brush: python; title: ; notranslate" title="">
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 上就可以了
<pre class="brush: python; highlight: [10,13,14,15,16,17]; title: ; notranslate" title="">
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 按鈕也能正常運作了