PyQt十讲 | 浅谈信号与槽


本篇推文共计1500个字,阅读时间约3分钟。

信号(Signal)和槽(Slot)是Qt编程中对象间通讯的机制。在Qt中,每一个QObject对象,包括PyQt中所有继承自QWidget的控件都支持signal和slot机制。

信号与槽机制作为Qt最重要的特性,提供了任意两个Qt对象之间的通信机制。信号会在某个特定情况或动作下被触发,槽是用于接收并处理信号的函数。

每个Qt对象都包含预定的信号和槽,当某一特定事件发生时,一个信号被发射,与信号相关联的槽则会响应信号同时完成相应的信号处理操作。 

开发工具版本

1.Pycharm 2019.1.3社区版 

2.Anaconda(Python 3.6.0,PyQt5)

信号与槽的关系

1.信号与槽是多对多的关系,即一个信号可以对应多个槽,一个槽可以对用多个信号。

2.信号与槽的连接方式可以是同步连接,也可以是异步连接。

3.信号和槽的连接可以跨线程。

信号与槽的特点

1.一个信号可以与另一个信号相连。 

connect(Object1,SIGNAL(signal1),Object2,SIGNAL(signal1)) 

即表示Object1的信号1发射可以触发Object2的信号1响应。 

2.表示一个信号可以与多个槽相连。

connect(Object1,SIGNAL(signal1),Object2,SLOT(slot2)) 

connect(Object1,SIGNAL(signal1),Object3,SLOT(slot3)) 

即表示Object1的信号1发射可以触发Object2的信号2和Object3的信号3响应。 

3.表示同一个槽可以响应多个信号。

connect(Object1,SIGNAL(signal2),Object2,SLOT(slot2)) 

connect(Object3,SIGNAL(signal3),Object2,SLOT(slot2)) 

即表示Object1的信号1和Object3的信号3发射都可以触发Object2的信号2响应。 

信号与槽三种使用方法

1.内置信号与槽的使用。

2.自定义信号与槽的使用。

3.装饰器的信号与槽的使用。

01

内置信号与槽的使用


使用方便,缺点明显,只能发射特定的信号(如按键被点击)。

如下示例代码:

import sys
from PyQt5.QtWidgets import QMessageBox,QPushButton,QApplication,QWidget

app=QApplication(sys.argv)
widget=QWidget()

def showMsg():
    QMessageBox.information(widget,'信息提示框','Ok 弹出测试信息')

btn=QPushButton('测试点击按钮',widget)
btn.clicked.connect(showMsg)
widget.show()
sys.exit(app.exec_())

运行之后如下所示:

点击左侧窗口中的“测试信息按钮”即可出现右侧信息提示框。

在这里用到的信号和槽机制是发射按钮信号时,使用窗口控件的函数,而不是自定义的函数。

02 

自定义信号与槽的使用


使用范围最广,用法灵活,相比第一种较难掌握。

首先需要记得自定义信号与槽的三要素:

1.定义信号。

2.定义槽函数。

3.连接信号与槽函数。

如下示例代码:

from PyQt5.QtWidgets import QMainWindow, QPushButton , QWidget , QMessageBox, QApplication, QHBoxLayout
import sys

class WinForm(QMainWindow):
    def __init__(self, parent=None):
        super(WinForm, self).__init__(parent)
        button1 = QPushButton('Button 1')
        button2 = QPushButton('Button 2')

        button1.clicked.connect(lambda: self.onButtonClick(1))
        button2.clicked.connect(lambda: self.onButtonClick(2))

        layout = QHBoxLayout()
        layout.addWidget(button1)
        layout.addWidget(button2)

        main_frame = QWidget()
        main_frame.setLayout(layout)
        self.setCentralWidget(main_frame)

    def onButtonClick(self, n):
        print('Button {0} 被按下了'.format(n))
        QMessageBox.information(self, "信息提示框", 'Button {0} clicked'.format(n))

if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = WinForm()
    form.show()
    sys.exit(app.exec_())

运行之后如下所示:

这里重点解释onButtonClick()函数是怎样处理从两个按钮传来的信号的。这里就是自定义的函数信号。

def onButtonClick(self, n):
        print('Button {0} 被按下了'.format(n))
        QMessageBox.information(self, "信息提示框", 'Button {0} clicked'.format(n))

使用lambda表达式传递按钮数字给槽函数,当然也可以传递其他任何东西,甚至是按钮控件本身。

button1.clicked.connect(lambda: self.onButtonClick(1))
button2.clicked.connect(lambda: self.onButtonClick(2))

03 

装饰器的信号与槽的使用

首先要执行这个函数:

# 信号自动连接到槽函数核心代码
QtCore.QMetaObject.connectSlotsByName(self)

槽函数的定义是:

@QtCore.pyqtSlot()
def on_发送对象的名字_发射信号的名字(self,参数):
    pass

完整测试代码:

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5 import QtCore
import sys

class CustWidget(QWidget):
    def __init__(self,parent=None):
        super(CustWidget, self).__init__()
 
        self.okBtn=QPushButton("点击连接"self)
        # 设置对象名称
        self.okBtn.setObjectName("okBtn")
        layout=QHBoxLayout()
        layout.addWidget(self.okBtn)
        self.setLayout(layout)
        # 信号自动连接到槽函数核心代码
        QtCore.QMetaObject.connectSlotsByName(self)
 
    @QtCore.pyqtSlot()
    def on_okBtn_clicked(self):
        print("连接成功")
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = CustWidget()
    win.show()
    sys.exit(app.exec_())

运行之后如下所示:

每按一下“点击连接”即可显示一次连接成功。

本文介绍了PyQt5信号与槽最基本的使用方法,让大家知道了如何调用自定义槽函数。掌握了这些基础知识,就可以动手实现一些基本的需求了。

看完本文如有任何疑问,可发送疑问至后台,工作人员看到后会第一时间为你解决。

END


图片|网络

编辑|一个码农

你与世界

只差一个

公众号


喜欢本文的话麻烦你点个“关注”加“在看”

觉得写得不错的话可以点击下方“喜欢作者”

你的支持是我不断前行的动力

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值