Loading

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

posted @ 2021-01-06 17:11  Unixcs  阅读(178)  评论(0编辑  收藏  举报