Qt中的信号与槽

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、总结

信号和槽非常灵活,可以通过内置的信号和槽实现组件之间的通信,也可以通过自定义来实现组件之间的通信

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值