分享

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

 刮骨剑 2019-03-07

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

答案当然是肯定的。

废话不说,直接上过程

1.制作界面

在该界面中点击按钮,然后设置标签的内容,功能很简单,主要是演示单击信号和槽函数是如何自动绑定的。

将该界面转换为python代码:

  1. # -*- coding: utf-8 -*-
  2. # Form implementation generated from reading ui file 'FormUI.ui'
  3. #
  4. # Created by: PyQt5 UI code generator 5.10
  5. #
  6. # WARNING! All changes made in this file will be lost!
  7. from PyQt5 import QtCore, QtGui, QtWidgets
  8. class Ui_Form(object):
  9. def setupUi(self, Form):
  10. Form.setObjectName("Form")
  11. Form.resize(400, 300)
  12. self.label = QtWidgets.QLabel(Form)
  13. self.label.setGeometry(QtCore.QRect(80, 50, 191, 41))
  14. font = QtGui.QFont()
  15. font.setFamily("方正姚体")
  16. font.setPointSize(14)
  17. self.label.setFont(font)
  18. self.label.setObjectName("label")
  19. self.btn_set = QtWidgets.QPushButton(Form)
  20. self.btn_set.setGeometry(QtCore.QRect(80, 120, 75, 23))
  21. self.btn_set.setObjectName("btn_set")
  22. self.retranslateUi(Form)
  23. QtCore.QMetaObject.connectSlotsByName(Form)
  24. def retranslateUi(self, Form):
  25. _translate = QtCore.QCoreApplication.translate
  26. Form.setWindowTitle(_translate("Form", "自动绑定例子演示"))
  27. self.label.setText(_translate("Form", "这是一个标签"))
  28. self.btn_set.setText(_translate("Form", "设置标签"))

注意该该界面中,按钮的名称或者对象名是语句设定的,

self.btn_set.setObjectName("btn_set")

按钮的名字设定为btn_set

同时大家注意:在setupUi函数的最后一句有这样的话:

QtCore.QMetaObject.connectSlotsByName(Form)

这句话什么意思呢?实现对象通过名字来自动绑定槽函数,也就是说如果槽函数的名字与对象某个事件的名字相同,将会实现自动绑定,行不行呢?

新增加一个python文件AutoBind.py,代码如下:

  1. import sys
  2. from PyQt5.QtWidgets import QApplication,QWidget
  3. import FormUI
  4. class mainCode(QWidget,FormUI.Ui_Form):
  5. def __init__(self):
  6. QWidget.__init__(self)
  7. FormUI.Ui_Form.__init__(self)
  8. self.setupUi(self)
  9. def on_btn_set_clicked(self):
  10. self.label.setText("我是自动绑定的")
  11. if __name__=='__main__':
  12. app=QApplication(sys.argv)
  13. mainc=mainCode()
  14. mainc.show()
  15. sys.exit(app.exec_())

在这个代码中,大家注意几个问题:

1.在构造函数

  1. def __init__(self):
  2. QWidget.__init__(self)
  3. FormUI.Ui_Form.__init__(self)
  4. self.setupUi(self)

里面没有手工绑定信号和槽函数的代码

在槽函数

  1. def on_btn_set_clicked(self):
  2. self.label.setText("我是自动绑定的")

中也没有添加什么代码,只是这个名字很特殊,名字是on_btn_set_clicked,这个名字是on_对象名_事件名组成,因为QtCore.QMetaObject.connectSlotsByName(Form)这个语句允许对象通过名字将事件(信号)与槽函数自动连接,这样,我们就不用手工绑定了。代码就能够自动运行。

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

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

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

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多