在文章使用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
联系客服