1、信号与槽介绍
信号(signal)和槽(slot)是Qt中的核心机制,也是在编程中对象之间的通信机制。在Qt中,每一个Qobject对象和Qt中所有继承自QWidget的控件 都支持信号和槽的机制。当信号发射时,链接槽的函数将会自动执行。在Qt中,信号与槽通过object.signal.connect()方法连接。
Qt的窗口控件类有很多内置信号,开发者也可以添加自定义信号,信号具有如下特点:
一个信号可以连接多个槽
一个信号可以连接另一个信号
信号参数可以是任何Python类型
一个槽可以监听多个信号
信号与槽的连接方式可以是同步连接,也可以是异步连接
信号与槽的连接可能会跨线程
在GUI编程中,当改变一个控件的状态时,通常需要通知另一个控件,也就是实现了对象之间的通信。在早期的GUI编程中使用的是回调机制,在Qt中则使用另一种新的机制-----信号与槽。在编写一个类时,要先定义该类的信号与槽,在类中信号与槽进行连接,实现对象之间的信号传输。
Qt中有内置信号和槽,也可以自定义信号和槽例如:
from PyQt5.QWidgets import*
import sys
class Winform(QWidget):
def__init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle('实例')
self.resize(330, 50)
btn = QPushButton('关闭', self)
btn.clicked.connect(self.close)
if __name__ =='__main__':
app = QApplication(sys.argv)
win = Winform()
win.show()
sys.exit(app.exec_())
在以上代码中,单击按钮时触发按钮内置信号(clicked),绑定窗口(QWidget)内置的槽函数self.close
2、内置信号和自定义槽函数
form PyQt5.QWidgets import*
import sys
class Winform(QWidget):
def__init__(self, parent=None):
self.setWindowTitle('内置信号和自定义槽函数')
self.resize(330, 50)
btn = QPushButton('关闭', self)
btn.clicked.connect(self.btn_colse)
def btn_close:
self.close()
if __name__ = '__main__':
app = QApplication(sys.argv)
win = Winform()
win.show()
sys.exit(app.exec_())
在上边的代码中,单击按钮触发内置信号clicked,绑定自定义槽函数self.btn_close
3、自定义信号和内置槽函数
from PyQt5.QWidgets import*
from PyQt5.QWidgets import pyqtSignal
import sys
class Winform(QWidget):
# 自定义信号
button_clicked_signal = pyqtSignal()
def __init__ (self, parent=None):
super().__init__(parent)
self.setWindowTitle('自定义信号和内置槽函数')
self.resize(330, 50)
btn = QPushButton('关闭', self)
btn.clicked.connect(self.btn_clicked)
self.button_clicked_signal.connect(self.close)
def btn_clicked(self):
# 发送自定义信号,无参数
self.button_clicked_signal.emit()
if __name__ = '__main__':
app = QApplication(sys.argv)
win = Winform()
win.show()
sys.exit(app.exec_())
以上代码中,单击自定义信号(button_clicked_signal),触发内置槽函数(self.colse)
4、自定义信号和槽函数
from PyQt5.QWidgets import*
from PyQt5.QtCore import pyqtSignal
import sys
class Winform(QWidget):
button_close_clicked = pyqtSignal()
def __init__(self, parent=Nnoe):
super().__init__(parent)
self.setWindowTitle('自定义信号和槽函数')
btn = QPushButton('关闭', self)
btn.clicked.connect(self.btn_clicked)
self.button_close_clicked.connect(self.btn_close)
def btn_close(self):
self.close()
def btn_clicked():
self.button_close_clicked.emit()
if __name__ = '__main__':
app = QApplication()
win = Winform()
win.show()
sys.exit(app.exec_())
以上代码 单击按钮触发自定义信号(button_colse_clicked),绑定自定义槽函数(self.btn_colse)
5、总结
信号和槽非常灵活,可以通过内置的信号和槽实现组件之间的通信,也可以通过自定义来实现组件之间的通信
2685

被折叠的 条评论
为什么被折叠?



