PyQt5之信号与槽介绍

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 sys
from PyQt5 import QtCore
from 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_())

运行效果如下:

PyQt5之信号与槽介绍_第1张图片

  1. 自定义信号与槽的使用:
import sys
from PyQt5 import QtCore
from 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()

运行效果如下:

PyQt5之信号与槽介绍_第2张图片

  1. 传递多个参数:
import sys
from PyQt5 import QtCore
from 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()

运行效果如下:

PyQt5之信号与槽介绍_第3张图片

你可能感兴趣的:(Python,python,pyqt)