博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PyQt5之信号与槽介绍
阅读量:3961 次
发布时间:2019-05-24

本文共 2500 字,大约阅读时间需要 8 分钟。

PyQt的窗口控件类中有很多内置信号,开发者也可以添加自定义信号。在编写一个类时,要先定义该类的信号与槽,在类中信号与槽连接,实现对象之间的数据传输。信号与槽具有如下特点:

  • 一个信号可以连接多个槽;
  • 一个信号可以连接另一个信号;
  • 信号参数可以是任何Python类型;
  • 一个槽可以监听多个信号;
  • 信号与槽的连接方式可以是同步连接,也可以是异步连接;
  • 信号与槽的连接可能会跨线程;
  • 信号可能会断开。

一、定义信号

  1. 为QObject对象创建信号:
-使用pyqtSignal()函数创建一个或多个重载的未绑定的信号作为类的属性,信号只能在QObject的子类中定义。-信号必须在类创建时定义,不能在类创建后作为类的属性动态添加进来。-使用pyqtSignal()函数创建信号时,信号可以传递多个参数,并指定信号传递参数的类型,参数类型是标准的Python数据类型(字符串、日期、布尔类型、数字、列表、元组和字典)。
  1. 为控件创建信号:
from PyQt5.QtCore import *from PyQt5.QtWidgets import *class WinForm(QMainWindow):	btnClickedSignal = pyqtSignal()#为自定义控件WinForm创建了一个btnClickedSignal信号

二、操作信号

  1. 使用connect()函数可以把信号绑定到槽函数上;
  2. 使用disconnect()函数可以解除信号与槽函数的绑定;
  3. 使用emit()函数可以发射信号。

三、信号与槽的入门应用

  1. 内置信号与槽的使用:
import sysfrom PyQt5 import QtCorefrom PyQt5.QtWidgets import *from PyQt5.QtGui import *from PyQt5.QtCore import *app = QApplication([])form = QWidget()def showMsg():    QMessageBox.information(form,"信息提示框","ok,弹出测试信息")btn = QPushButton('测试点击按钮',form)#将信号与槽绑定,clicked为内置信号,单击按钮会出现提示框btn.clicked.connect(showMsg)form.show()sys.exit(app.exec_())

运行效果如下:

在这里插入图片描述

  1. 自定义信号与槽的使用:
import sysfrom PyQt5 import QtCorefrom PyQt5.QtWidgets import *from PyQt5.QtGui import *from PyQt5.QtCore import *#信号对象class QTypeSignal(QObject):    #生成一个信号    sendmsg = pyqtSignal(object)    def __init__(self):        super().__init__()    def run(self):        #发射信号        self.sendmsg.emit('Hello Python')#槽对象class QTypeSlot(QObject):    def __init__(self):        super().__init__()    #槽函数接收数据    def get(self,msg):        print("QSlot get message => "+ msg)if __name__ == "__main__":    send = QTypeSignal()    slot = QTypeSlot()    print('将信号绑定槽:')    #将信号绑定到槽函数上    send.sendmsg.connect(slot.get)    send.run()    print('将信号与槽断开')    #将信号与槽函数的连接断开    send.sendmsg.disconnect(slot.get)    send.run()

运行效果如下:

在这里插入图片描述

  1. 传递多个参数:
import sysfrom PyQt5 import QtCorefrom PyQt5.QtWidgets import *from PyQt5.QtGui import *from PyQt5.QtCore import *#信号对象class QTypeSignal(QObject):    #生成一个信号    sendmsg = pyqtSignal(str,str)    def __init__(self):        super().__init__()    def run(self):        #发射信号        self.sendmsg.emit('第一个参数','第二个参数')#槽对象class QTypeSlot(QObject):    def __init__(self):        super().__init__()    #将槽函数接收数据    def get(self,msg1,msg2):        print("QSlot get message => "+ msg1 + ' ' + msg2)if __name__ == "__main__":    send = QTypeSignal()    slot = QTypeSlot()    print('将信号绑定槽:')    #将信号绑定到槽函数上    send.sendmsg.connect(slot.get)    send.run()    print('将信号与槽断开')    #将信号与槽函数的连接断开    send.sendmsg.disconnect(slot.get)    send.run()

运行效果如下:

在这里插入图片描述

转载地址:http://bxozi.baihongyu.com/

你可能感兴趣的文章
freerice
查看>>
Does your mother know
查看>>
《写出质量好软件的75条体会》暨答案ZT [转自monkyy的blog]
查看>>
关于详细设计
查看>>
POJ2838,Sliding Window(单调队列)
查看>>
牛客练习赛50,B tokitsukaze and Hash Table(STL+输入输出挂)
查看>>
POJ3728,The merchant(倍增LCA+分治)
查看>>
2019 ICPC Malaysia National,E. Optimal Slots(01背包变形)
查看>>
洛谷P1638 逛画展(双向队列)
查看>>
牛客练习赛51,D(二分图匹配)
查看>>
POJ2892,Tunnel Warfare(线段树维护连续区间)
查看>>
POJ3468,A Simple Problem with Integers(线段树-区间查询-区间更新)
查看>>
快速幂(递归)
查看>>
CodeForces 1101A Minimum Integer(思维)
查看>>
CodeForces 1102A Integer Sequence Dividing(思维)
查看>>
CodeForces 1087B Div Times Mod(思维)
查看>>
杭电ACM——4310,Hero(贪心)
查看>>
杭电ACM——1789,Doing Homework Again(贪心)
查看>>
北大ACM——2782,Bin Packing(贪心)
查看>>
北大ACM——4014,Dice(贪心)
查看>>