PyQT5的信号与槽

如果你接触到这部分,说明对控件和布局管理有了一定的了解。

首先我们要知道QT核心机制就是信号与槽,也是对象间进行通信的重要机制,不像python/java通过函数调用就可以。

信号与槽的三种使用方法

信号分为自定义与内置,槽也分为槽函数(控件本身的)和自定义槽函数,信号与槽使用中可以任意组合。

  1. 内置信号与槽:这是指使用窗口控件内置的控件调用槽函数,槽函数可以自定义也可以使用内置的函数,下面是使用自定义的showMsg槽函数进行演示,内置需要我们熟悉控价的相关文档。
    from PyQt5.QtWidgets import  QPushButton ,  QApplication, QWidget 
    from  PyQt5.QtWidgets import QMessageBox  
    import sys 
    app =  QApplication(sys.argv)
    widget =  QWidget()
    #自定义一个槽函数
    def showMsg():
         QMessageBox.information(widget, "信息提示框", "ok,弹出测试信息") 
    #内置信号QPushButton控件
    btn = QPushButton( "测试点击按钮", widget)
    #信号与槽通过object.singnal.connect()方法进行连
    btn.clicked.connect(showMsg)
    
    widget.show()
    sys.exit(app.exec_())
    
  2. 自定义信号与槽:我们可以使用PyQt5.QtCore.pyqtSingal为QObject创建一个自定义信号,如sendmsg = pyqtSignal(object)定义一个信号,需要注意只能在QObject的子类中定义。其执行流程就是:定义信号-->定义槽函数-->连接信号与曹函数-->发射信号。
    from PyQt5.QtCore import QObject, pyqtSignal
    # 信号对象
    class QTypeSignal(QObject):
        # 定义一个信号
        sendmsg = pyqtSignal(object)
        def __init__(self):
            super(QTypeSignal, self).__init__()
        def run(self):
            # 发射信号
            self.sendmsg.emit('Hello Pyqt5')
    # 槽对象          
    class QTypeSlot(QObject):
        def __init__(self):
            super(QTypeSlot, self).__init__()
        def get(self, msg):
            print("QSlot get msg => " + msg)
    
    
    if __name__ == '__main__':
        send = QTypeSignal()
        slot = QTypeSlot()
    #将send对象的sendmsg信号发射给slot对象的get函数
        send.sendmsg.connect(slot.get)
        send.run()
    
  3. 装饰器的信号与槽:

  4. 装饰器的方法定义信号和槽

    @PyQt5.QtCore.pyqtSlot(parameter)

    def on_发送者对像名称_发射信号名称(self, parameter):

             pass

     生效的前提是已经执行QtCore.QMetaObject.connectSlotsByName(self)

  5. QtCore.QMetaObject.connectSlotsByName作用是根据信号名称自动连接槽函数,就是将QObject的子孙对象按照objectName连接到相应的槽函数

from PyQt5 import QtCore 
from PyQt5.QtWidgets import QApplication ,QWidget ,QHBoxLayout , QPushButton
import sys    
 
class CustWidget( QWidget ):
    def __init__(self, parent=None):
        super(CustWidget, self).__init__(parent)
        self.okButton = QPushButton("OK", self)
        #使用setObjectName设置okButton为对象名称
        self.okButton.setObjectName("okButton")        
        layout =  QHBoxLayout()
        layout.addWidget(self.okButton)
        self.setLayout(layout)                
        QtCore.QMetaObject.connectSlotsByName(self)
       #去掉on是因为会受connectSlotsByName的影响
       #self.okButton.clicked.connncet(okButton_clicked)
      
    @QtCore.pyqtSlot()#运行self.okButton.clicked.connncet(okButton_clicked)修饰器要去掉。
    def on_okButton_clicked(self):
        print( "点击了OK按钮")
           
if __name__ == "__main__":        
    app =  QApplication(sys.argv)
    win = CustWidget()
    win.show()
    sys.exit(app.exec_())

读PyQt5快速开发与实战--学习笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值