訊號與槽函式的自動繫結(三)
阿新 • • 發佈:2019-02-05
在文章使用PyQt5製作介面(實現介面與程式碼的分離)(二)中,實現了介面與程式碼的分離,但是需要手工進行訊號與槽函式的繫結,那麼能不能實現訊號和超函式的自動繫結呢?
答案當然是肯定的。
廢話不說,直接上過程
1.製作介面
在該介面中點選按鈕,然後設定標籤的內容,功能很簡單,主要是演示單擊訊號和槽函式是如何自動繫結的。
將該介面轉換為python程式碼:
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'FormUI.ui' # # Created by: PyQt5 UI code generator 5.10 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets class Ui_Form(object): def setupUi(self, Form): Form.setObjectName("Form") Form.resize(400, 300) self.label = QtWidgets.QLabel(Form) self.label.setGeometry(QtCore.QRect(80, 50, 191, 41)) font = QtGui.QFont() font.setFamily("方正姚體") font.setPointSize(14) self.label.setFont(font) self.label.setObjectName("label") self.btn_set = QtWidgets.QPushButton(Form) self.btn_set.setGeometry(QtCore.QRect(80, 120, 75, 23)) self.btn_set.setObjectName("btn_set") self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "自動繫結例子演示")) self.label.setText(_translate("Form", "這是一個標籤")) self.btn_set.setText(_translate("Form", "設定標籤"))
注意該該介面中,按鈕的名稱或者物件名是語句設定的,
self.btn_set.setObjectName("btn_set")
按鈕的名字設定為btn_set
同時大家注意:在setupUi函式的最後一句有這樣的話:
QtCore.QMetaObject.connectSlotsByName(Form)
這句話什麼意思呢?實現物件通過名字來自動繫結槽函式,也就是說如果槽函式的名字與物件某個事件的名字相同,將會實現自動繫結,行不行呢?
新增加一個python檔案AutoBind.py,程式碼如下:
import sys from PyQt5.QtWidgets import QApplication,QWidget import FormUI class mainCode(QWidget,FormUI.Ui_Form): def __init__(self): QWidget.__init__(self) FormUI.Ui_Form.__init__(self) self.setupUi(self) def on_btn_set_clicked(self): self.label.setText("我是自動繫結的") if __name__=='__main__': app=QApplication(sys.argv) mainc=mainCode() mainc.show() sys.exit(app.exec_())
在這個程式碼中,大家注意幾個問題:
1.在建構函式
def __init__(self):
QWidget.__init__(self)
FormUI.Ui_Form.__init__(self)
self.setupUi(self)
裡面沒有手工繫結訊號和槽函式的程式碼
在槽函式
def on_btn_set_clicked(self):
self.label.setText("我是自動繫結的")
中也沒有新增什麼程式碼,只是這個名字很特殊,名字是on_btn_set_clicked,這個名字是on_物件名_事件名組成,因為QtCore.QMetaObject.connectSlotsByName(Form)這個語句允許物件通過名字將事件(訊號)與槽函式自動連線,這樣,我們就不用手工綁定了。程式碼就能夠自動執行。
以上的方法要求槽函式的名字必須遵守一定的規則,這樣訊號(事件)與槽函式就能自動繫結。
當然還有一些情況比較複雜,不過都可以實現自動繫結的,這樣可以省事不少,具體可以參開網址