zoukankan      html  css  js  c++  java
  • pyqt5 信号与槽

    前言

    信号与槽 是pyqt的精髓,要多总结学习一下

    开始

    介绍

    定义 通俗解释
    事件源:状态发生改变的对象,它产生事件 Source_Obj 按钮 (对象)
    事件目标:是想要被通知的对象 Target_Obj 被点击 (状态发生改变)
    事件对象:封装了事件源中的状态变化 Evnet_Obj 执行 (调用函数)
    • 自定义信号的一般流程*

      1. 定义信号。
      2. 定义槽函数。
      3. 连接信号与槽函数。
      4. 发射信号。
    • 定义信号
      Signal = pyqtSignal(str) # Signal 为自定义变量

    • 定义槽函数

        def use(self):
            print("触发槽函数成功")
    
    • 绑定槽和信号
      self.Signal.connect(self.use)
    • 发射信号
      self.signal.emit()

    理解

    按钮+槽

    一般情况下 我们单击button按钮

    单击按钮后执行 按钮背后绑定的槽

    信号+槽

    上面说到 单击按钮可以理解为 信号的发送 → 槽的触发
    如果拆分开来看,背后的整个执行过程:

    1. 信号发送 # 信号.emit()
    2. 触发信号 绑定的槽 # 信号.connect(self.槽函数)
    3. 执行槽函数

    案例

    '''
    
    使用线程类(QThread)编写计数器
    
    
    QThread
    
    def run(self):
       while True:
           self.sleep(1)
           if sec == 5:
               break;
    
    QLCDNumber
    
    
    
    WorkThread(QThread)
    用到自定义信号
    
    '''
    
    import sys
    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *
    
    sec = 0
    
    class WorkThread(QThread):
        timer = pyqtSignal()   # 每隔1秒发送一次信号
        end = pyqtSignal()     # 计数完成后发送一次信号
        def run(self):
            while True:
                self.sleep(1)  # 休眠1秒
                if sec == 5:
                    self.end.emit()   # 发送end信号
                    break
                self.timer.emit()   # 发送timer信号
    
    class Counter(QWidget):
    
        def __init__(self, parent=None):
            super(Counter, self).__init__(parent)
    
            self.setWindowTitle("使用线程类(QThread)编写计数器")
            self.resize(300, 120)
    
            layout = QVBoxLayout()
            self.lcdNumber = QLCDNumber()
            layout.addWidget(self.lcdNumber)
    
            button = QPushButton('开始计数')
            layout.addWidget(button)
    
            self.workThread = WorkThread()
    
            self.workThread.timer.connect(self.countTime)
            self.workThread.end.connect(self.end)
            button.clicked.connect(self.work)
    
            self.setLayout(layout)
    
        def countTime(self):
            global sec
            sec += 1
            self.lcdNumber.display(sec)
    
        def end(self):
            QMessageBox.information(self,'消息','计数结束',QMessageBox.Ok)
    
        def work(self):
            self.workThread.start()
    
    
    
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        form = Counter()
        form.show()
        sys.exit(app.exec_())
    

    参考:
    http://www.broadview.com.cn/article/824

  • 相关阅读:
    手机浏览器
    一招封住360流氓
    原来在Delphi中的类型是严格匹配的
    Windows 7下面3389远程连接时“超出最大连接数”解决办法
    大家开发过淘宝商城API应用的么?
    adodb.recordset 添加记录后无法取得ID
    VBATrack Picture
    java web后台开发SSM框架(Spring+SpringMVC+MyBaitis)搭建与优化
    VBATrack MsgBox
    VBATrack 暂停3秒运行
  • 原文地址:https://www.cnblogs.com/unixcs/p/14242180.html
Copyright © 2011-2022 走看看