信号槽机制简介
信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性。所有从 QObject 或其子类 ( 例如 Qwidget) 派生的类都能够包含信号和槽。当对象改变其状态时,信号就由该对象发射出去,它不用知道另一端是谁在接收这个信号。这就是真正的信息封装,它确保对象被当作一个真正的软件组件来使用。槽用于接收信号,但它们是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且,对象并不了解具体的通信机制。信号与槽之间可以一对一也可以多对一或者一对多。
具体实现
使用自带的槽函数
这样讲起来很乱,因为基本都是从网上找的,还是直接用例子来说明。
点击工具栏上的“编辑信号/槽”,进入信号槽编辑模式,我们可以直接在发送者(button)上按住鼠标左键不放,拖动到接收者(Form窗体)上。这样就建立起了连接。
然后选择继承,然后可以选择触发信号与执行的槽函数,这里选择close()。
点击按钮后,按钮对象会发送一个信号到Form窗口,窗口接收到信号后执行槽函数
这样实现的的是点击按钮后窗口关闭。
使用自定义槽函数
流程如下
import sys
from PyQt5 import QtWidgets, QtCore
from demo import Ui_Form #这里导入的是经过pyuic转换的ui文件
class mainwindow(QtWidgets.QWidget, Ui_Form):
def __init__(self):
super(mainwindow, self).__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self.myprint) #槽函数不用加()
def myprint(self):
print("-----print-----")
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = mainwindow()
window.show()
sys.exit(app.exec_())
注意
槽函数就是一个方法,可以使普通的成员函数,也可以是匿名函数。信号的connect最好放在__init__中,若在方法中定义需要disconnect,防止多次连接的情况发生。