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

  • 相关阅读:
    参数是指针,传递指针变量,最后函数总分配的内存丢了
    GoDaddy域名注册/空间购买优惠码
    Godaddy主机新建网站说明
    Godaddy主机购买图解教程
    Godaddy 如何添加独立IP到主机账户
    GoDaddy域名注册图解
    Godaddy windows主机添加域名,删除域名,添加子域名 操作说明
    ASP.net与PHP两大网站开发架构优势对比
    Godaddy如何导入导出MSSQL数据库
    什么是DSN文件
  • 原文地址:https://www.cnblogs.com/unixcs/p/14242180.html
Copyright © 2011-2022 走看看