前言
信号与槽 是pyqt的精髓,要多总结学习一下
开始
介绍
定义 | 通俗解释 |
---|---|
事件源:状态发生改变的对象,它产生事件 Source_Obj | 按钮 (对象) |
事件目标:是想要被通知的对象 Target_Obj | 被点击 (状态发生改变) |
事件对象:封装了事件源中的状态变化 Evnet_Obj | 执行 (调用函数) |
-
自定义信号的一般流程*
- 定义信号。
- 定义槽函数。
- 连接信号与槽函数。
- 发射信号。
-
定义信号
Signal = pyqtSignal(str)
# Signal 为自定义变量 -
定义槽函数
def use(self):
print("触发槽函数成功")
- 绑定槽和信号
self.Signal.connect(self.use)
- 发射信号
self.signal.emit()
理解
按钮+槽
一般情况下 我们单击button
按钮
单击按钮后执行 按钮背后绑定的槽
信号+槽
上面说到 单击按钮可以理解为 信号的发送 → 槽的触发
如果拆分开来看,背后的整个执行过程:
信号发送
#信号.emit()
- 触发
信号 绑定的槽
#信号.connect(self.槽函数)
- 执行
槽函数
案例
'''
使用线程类(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_())