在文章使用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", "设置标签"))
注意该该界面中,按钮的名称或者对象名是语句设定的,
按钮的名字设定为btn_set
同时大家注意:在setupUi函数的最后一句有这样的话:
这句话什么意思呢?实现对象通过名字来自动绑定槽函数,也就是说如果槽函数的名字与对象某个事件的名字相同,将会实现自动绑定,行不行呢?
新增加一个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)这个语句允许对象通过名字将事件(信号)与槽函数自动连接,这样,我们就不用手工绑定了。代码就能够自动运行。
以上的方法要求槽函数的名字必须遵守一定的规则,这样信号(事件)与槽函数就能自动绑定。
当然还有一些情况比较复杂,不过都可以实现自动绑定的,这样可以省事不少,具体可以参开网址
http://pyqt.sourceforge.net/Docs/PyQt5/signals_slots.html?highlight=connectslotsbyname