信号(signal)和槽(slot)是Qt的核心机制。在创建事件循环之后,通过建立信号和槽的链接就可以实现对象之间的通信。当信号发射(emit)时,连接的槽函数将自动执行。在PyQt5中,信号和槽通过QObject.signal.connect)连接。
新建一个模板为Widget
的简单窗口,左侧有一个Buttons栏,选择PushBotton空间,拖拽到Form中,将text属性改为关闭窗口。
点击工具栏谁给你的“编辑信号/槽”或者点击 “Edit”(编辑)菜单-编辑信号/槽,进入信号槽编辑模式,可以直接发射者上按住鼠标左键不放,拖动到接收者上,建立了连接
可以看到按钮控件有很多的发射信号,只要选择一个信号,然后点击ok按钮,就会生成对应的槽函数对按钮发射的该信号进行处理。
由于要达到点击按钮关闭窗口的效果,所以需要勾选“显示QWdiget继承的信号和槽”的复选框,在左侧的closeWinBtn按钮的信号栏选择clicked()信号,在右侧的Form槽函数中选择close()。这意味着关闭窗口按钮会发射clicked信号,这个信号会被Form窗口的槽函数close()捕捉到,并触发该窗体的close行为
转换为python文件为
# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(791, 528)
self.closeWinBtn = QtWidgets.QPushButton(Form)
self.closeWinBtn.setGeometry(QtCore.QRect(430, 230, 75, 23))
self.closeWinBtn.setObjectName("closeWinBtn")
self.retranslateUi(Form)
self.closeWinBtn.clicked.connect(Form.close)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.closeWinBtn.setText(_translate("Form", "关闭窗口"))
self.closeWinBtn.clicked.connect(Form.close)
其实现的流程是:按钮是信号发射者,当单击按钮之后会发射一个信号,通过折行代码程序内部的通信机制会知道这个按钮的单击事件被连续都窗体的关闭事件上,然后通过接受者窗体,可以运行槽函数close()
为了使窗口的显示和业务逻辑分离,调用函数
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from MainWinSignalSlog01 import Ui_Form
class MyMainWindow(QMainWindow, Ui_Form):
def __init__(self, parent=None):
super(MyMainWindow, self).__init__(parent)
self.setupUi(self)
if __name__ == "__main__":
app = QApplication(sys.argv)
myWin = MyMainWindow()
myWin.show()
sys.exit(app.exec_())
self.checkBox.clicked['bool'].connect(self.label.setVisible)
self.checkBox.clicked['bool'].connect(self.lineEdit.setEnabled)
具体和信号与槽的代码如上。
具体的调用函数
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from MainWinSignalSlog03 import Ui_MainWindow
class MyMainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MyMainWindow, self).__init__(parent)
self.setupUi(self)
self.checkBox.setChecked(True) # 设置checkBox默认的初始状态为选择
if __name__ == "__main__":
app = QApplication(sys.argv)
win = MyMainWindow()
win.show()
sys.exit(app.exec_())