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_())
posted @ 2022-08-14 12:32  可乐芬达  阅读(827)  评论(0编辑  收藏  举报