本文展示了 pyqt5 信號槽的裝飾器實現方式(借鑒自 eirc6)
一個簡單的例子。實現功能:兩個數相加,顯示結果。如圖
兩個文件,第一個是界面文件 ui_calc.py
# ui_calc.py from PyQt5 import QtCore, QtGui, QtWidgets class Ui_Calc(object): def setupUi(self, Form): self.inputSpinBox1 = QtWidgets.QSpinBox(Form) self.inputSpinBox1.setGeometry(QtCore.QRect(1, 26, 46, 25)) self.inputSpinBox1.setObjectName("inputSpinBox1") # 必須 self.inputSpinBox2 = QtWidgets.QSpinBox(Form) self.inputSpinBox2.setGeometry(QtCore.QRect(70, 26, 46, 25)) self.inputSpinBox2.setObjectName("inputSpinBox2") # 必須 self.outputWidget = QtWidgets.QLabel(Form) self.outputWidget.setGeometry(QtCore.QRect(140, 24, 36, 27)) self.outputWidget.setObjectName("outputWidget") # 必須 QtCore.QMetaObject.connectSlotsByName(Form) # 必須
說明:1. 界面部件需要setObjectname ; 2. 最后必須 QtCore.QMetaObject.connectSlotsByName(Form)
第二個是邏輯文件 calc.py
# calc.py
from PyQt5.QtCore import pyqtSlot from PyQt5.QtWidgets import QApplication, QWidget from ui_calc import Ui_Calc
# 方式一 class MyCalc(QWidget): def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_Calc() self.ui.setupUi(self) @pyqtSlot(int) def on_inputSpinBox1_valueChanged(self, value): self.ui.outputWidget.setText(str(value + self.ui.inputSpinBox2.value())) @pyqtSlot(int) def on_inputSpinBox2_valueChanged(self, value): self.ui.outputWidget.setText(str(value + self.ui.inputSpinBox1.value()))
# 方式二 class MyCalc2(QWidget, Ui_Calc): def __init__(self, parent=None): super().__init__(parent) self.setupUi(self) @pyqtSlot(int) def on_inputSpinBox1_valueChanged(self, value): self.outputWidget.setText(str(value + self.inputSpinBox2.value())) @pyqtSlot(int) def on_inputSpinBox2_valueChanged(self, value): self.outputWidget.setText(str(value + self.inputSpinBox1.value()))
if __name__ == '__main__': import sys app = QApplication(sys.argv) win = MyCalc()
# win = MyCalc2() win.show() sys.exit(app.exec_())