1. 程式人生 > >訊號與槽函式的自動繫結(三)

訊號與槽函式的自動繫結(三)

在文章使用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)這個語句允許物件通過名字將事件(訊號)與槽函式自動連線,這樣,我們就不用手工綁定了。程式碼就能夠自動執行。

以上的方法要求槽函式的名字必須遵守一定的規則,這樣訊號(事件)與槽函式就能自動繫結。

當然還有一些情況比較複雜,不過都可以實現自動繫結的,這樣可以省事不少,具體可以參開網址