举例说明信号与槽的关系
实现功能:按下button关闭窗口
方法一
在QTdesigned 里面按快捷键F4,进入信号与槽编辑页面,鼠标左键按住button,拖动到button外,自动打开配置信号与槽连接配置页面,页面左边是信号,右边是槽,直接勾选即可。
若右边没有可以自定义相关槽函数,但函数名不能是方法二中的名字。按照此方法生成的ui文件在转换成py文件之后会在代码中生成连接信息。为确保ui与业务逻辑分离,不建议此操作。建议采用方法二,或者直接在业务逻辑中实现信号与槽函数的连接操作。
方法二
QTdesigned里面不做连接操作,直接生成ui文件,调用UIC,将ui文件生成py代码,实现过程可参照我的另一篇博客。
在ui的py代码中可以看到如下函数
QtCore.QMetaObject.connectSlotsByName(mainWindow)
该函数意思是通过名字自动连接信号与槽
ObjectName的控件对应的槽函数名称为on_ObjectName_Singal()
举例说明:
按钮btnOK,对应的槽函数为on_btnOK_clicked()
自定义窗口类中实现该槽函数即可。注意,槽函数前需要加修饰符@pyqtSlot()
修饰符需导入模块from PyQt5.QtCore import pyqtSlot
Talk is cheap, show me the code
class MyWindows(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.ui = Ui_mainWindow()
self.ui.setupUi(self)
@pyqtSlot()
def on_btnCleanLog_clicked(self):
# do what you want to do here
# @pyqtSlot()
def closeEvent(self, event):
reply = QMessageBox.question(self, '警告', "你确定要关闭窗口?",
QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
# 判断返回值,如果点击的是Yes按钮,我们就关闭组件和应用,否则就忽略关闭事件
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()