zoukankan      html  css  js  c++  java
  • 【PyQt5】信号与槽用法入门

    ——学习《PyQt5快速开发与实战》的笔记

    0.信号与槽机制的特点:

    1.1 signal、slot都继承自 QtCore
    1.2 signal与slot 可以 1对1,1对n,n对1,n对n
    1.3 signal可以带参数,参数可以是python任意类型,str,num(intfloat),bool,date,list,dict,tuple)
    1.4 QObject.signal.connect(slot),连接
    1.5 signal和slot可以是同步,也可以是异步(不懂)
    1.6 可以跨线程
    1.7 有可能会断开

    核心使用语句:

    控件:信号需要跟控件绑定
    signal:有内置和自定义两种方式
    操作方法:connect、disconnect、emit
    slot:有内置和自定义两种方式

    1.控件绑定信号

    from PyQt5.QtCore import pyqtSignal
    from PyQt5.QtWidgets import QMainWindow
    
    class window(QMainWindow):
        # 直接在控件里面写一个信号变量,是类的全局变量
        btnClicked = pyqtSignal() #无参数信号

    2、操作信号的方法

    QObject.signal.connect(slot[, type=PyQt5.QtCore.QtAutoConnection[,no_reviver_check=False]])
      # slot - 要连接的那个槽函数,或者是另外一个信号
      # type - 连接的类型,这个一时半会还用不到,
      # no_revicer_check - 不让底层的C++接收器实例保持存在并且传递信号,默认状态是False,那就是要保持存在并且传递信号
    QObject.signal.disconnect(slot)
      # slot - 要断开连接的槽函数
    QObject.signal.emit(*args)
      # *args 可变参数,什么类型可以接受

    3、入门案例

    三种方式:
    3.1 内置信号与槽
    3.2 自定义信号与槽
    3.3 装饰器信号与槽(1的衍生,先不管)

    3.1 内置信号与槽

    # 3.1 内置信号和槽的使用
    from PyQt5.QtWidgets import QPushButton, QApplication,QWidget
    from PyQt5.QtWidgets import QMessageBox
    import sys
    
    app =QApplication([])
    widget = QWidget()
    
    def showmsg():
        QMessageBox.information(widget,'信号提示框','OK,弹出测试信息')
    
    
    if __name__ == '__main__':
    
        btn = QPushButton('测试点击按钮',widget)
        btn.clicked.connect(showmsg) # clicked 内置信号方法 showmsg 槽函数名称,作为索引
        widget.show()
        sys.exit(app.exec_())

      3.2 自定义信号与槽的使用

    # 3.2 自定义信号与槽的使用
    from PyQt5.QtCore import QObject, pyqtSignal
    
    # 自定义的信号对象
    class Q_type_signal( QObject):
        #定义信号
        sendmsg = pyqtSignal(object)
    
        def __init__(self):
            super(Q_type_signal, self).__init__()
    
        def run(self,send_msg):
            #发射信号
    
            self.sendmsg.emit(send_msg) #send_msg 就是下面槽函数 get() 接受的 msg变量
    
    class Q_type_slot( QObject):
        def __init__(self):
            super(Q_type_slot, self).__init__()
    
        def get(self,msg):
            print('QSlot get msg:'+ msg)
    
    if __name__ == '__main__':
        send = Q_type_signal()
        slot = Q_type_slot()
    
        send.sendmsg.connect(slot.get)
        send.run('hahaha')

      动作分解:

     执行结果:

     上面执行的是带有一个参数的信号传递,两个信号也是一样,只需要添加变量即可:

        def run(self,send_msg,send_int):
            #发射信号
            self.sendmsg.emit(send_msg, send_int) 
    
    
        def get(self,msg,int):
            print('QSlot get msg:'+ msg + int)

       3.3 自定义信号与自定义槽

    from PyQt5.QtWidgets import *
    from PyQt5.QtCore import pyqtSignal
    import sys
    
    class Winform(QWidget):
        # 自定义信号,不带参数
        btn_clicked_signal = pyqtSignal()
    
        def __init__(self, parent=None):
            super().__init__(parent)
            self.setWindowTitle('自定义信号/内置槽示例')
            self.resize(200, 50)
            btn = QPushButton('关闭', self)
            # 连接信号与槽1
            btn.clicked.connect(self.btn_clicked)
            # 接收信号,连接到自定义槽函数
            # self.btn_clicked_signal.connect(self.close)  
            self.btn_clicked_signal.connect(self.btn_close)
    
        def btn_clicked(self):
            # 自定义信号发送,无参数
            self.btn_clicked_signal.emit()
    
        def btn_close(self):
            # 自定义槽函数
            self.close()
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        win = Winform()
        win.show()
        sys.exit(app.exec_())

    自定义的信号:btn_clicked_signal,需要调用btn_clicked()发送信号
    自定义的槽:btn_close,内部实际上调用了内置槽函数close()

    说实话,这个案例很容易让人混淆 内置和自定义,无论是信号还是槽。

  • 相关阅读:
    MDK+VS+Eclipse的STM32库V3.5工程模板的建立(六)
    MDK+VS+Eclipse的STM32库V3.5工程模板的建立(一)
    MDK+VS+Eclipse的STM32库V3.5工程模板的建立(四)
    ognl.OgnlException: target is null for setProperty(null, "username", [Ljava.lang.String;@19af9e98)
    Hibernate联合主键Annotation
    struts2入门第一天配置环境
    为什么java的构造方法中this()或者super()要放在第一行
    几种解决IE6下PNG图片透明问题
    IE6解决min_height
    一个拖拽例子
  • 原文地址:https://www.cnblogs.com/watalo/p/12287421.html
Copyright © 2011-2022 走看看