信号与槽函数的自动绑定(三)

在文章使用PyQt5制作界面(实现界面与代码的分离)(二)中,实现了界面与代码的分离,但是需要手工进行信号与槽函数的绑定,那么能不能实现信号和超函数的自动绑定呢?

答案当然是肯定的。

废话不说,直接上过程

1.制作界面

信号与槽函数的自动绑定(三)_第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)这个语句允许对象通过名字将事件(信号)与槽函数自动连接,这样,我们就不用手工绑定了。代码就能够自动运行。

以上的方法要求槽函数的名字必须遵守一定的规则,这样信号(事件)与槽函数就能自动绑定。

当然还有一些情况比较复杂,不过都可以实现自动绑定的,这样可以省事不少,具体可以参开网址

http://pyqt.sourceforge.net/Docs/PyQt5/signals_slots.html?highlight=connectslotsbyname

 

你可能感兴趣的:(PyQt5)