PyQT 的信号和槽
一、基本概念
信号与槽是Qt的核心机制,也是PyQt5编程时对象之间通信的基础,在PyQt5中每一个QObject对象(包括各种窗口和控件)都支持信号与槽机制,通过信号与槽之间的关联,就可以实现对象之间的通信,当信号发射时,连接的槽函数就自动执行,在PyQt5中信号与槽是通过对象的 signal.connect() 连接的。
PyQt5使用信号与槽的主要特点:
- 一个信号可以使用多个槽
- 一个槽可以监听多个信号
- 信号与信号之间可以互联
- 信号与槽之间的连接可以跨线程
- 信号与槽的连接方式既可以是同步也可以是异步
- 信号的参数可以是任何Python类型
二、信号和槽的使用
1. 使用内置的信号和槽
import sys
from PySide2.QtWidgets import QPushButton, QMessageBox, QApplication, QWidget
def pop_message():
QMessageBox.information(widget, 'Pop messgae', 'OK')
app = QApplication(sys.argv)
widget = QWidget()
btn = QPushButton('Test Button', widget)
btn.clicked.connect(pop_message)
widget.resize(300,300)
widget.show()
sys.exit(app.exec_())
2. 使用自定义的信号和槽
# -*- coding: utf-8 -*-
import sys
from PySide2 import QtCore
from PySide2.QtWidgets import *
class WinForm(QWidget):
# 自定义信号,不带参数
button_clicked_signal = QtCore.Signal()
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle('自定义信号和槽函数示例')
self.resize(300, 150)
# 接收信号,连接到自定义槽函数
self.button_clicked_signal.connect(self.pop_message)
def pop_message(self):
QMessageBox.information(self, 'Pop messgae', 'OK')
def mousePressEvent(self, event): # 重写鼠标按下事件
if event.button() == QtCore.Qt.LeftButton: # 当鼠标左键单击时
self.button_clicked_signal.emit() # 发射信号
if __name__ == '__main__':
app = QApplication(sys.argv)
win = WinForm()
win.show()
sys.exit(app.exec_())