- Event介绍
- 信号槽介绍
主要内容 #
完成效果 #
完成本节课程,能了解PyQt5的事件,信号槽处理。
效果如下:
收获 #
学习完本节内容,我们会知道什么是事件,以及信号槽机制如何处理事件。
1.Event介绍 #
所有的应用都是事件驱动的。事件大部分都是由用户的行为产生的,当然也有其他的事件产生方式,比如网络的连接,窗口管理器或者定时器等。
调用应用的exec_()方法时,应用会进入主循环,主循环会监听和分发事件。
在事件模型中,有三个角色:
- 事件源
- 事件对象
- 事件目标
事件源就是发生了状态改变的对象,它产生了事件。事件对象(event)封装了事件源中的状态变化。事件目标是事件想作用的目标。事件源绑定事件处理函数,然后作用于事件目标身上。
拓展练习:回顾上节课创建字体选择对话框,思考用户用鼠标点击选择字体,属于事件模型中的哪个角色?
2.信号槽介绍 #
PyQt5 有一个独特的信号槽(signal & slot)机制来处理事件,信号槽用于对象间的通信。
信号(signal) 在某一特定事件发生时被触发。
槽(slot)可以被任何Python脚本调用。
当信号被触发时,与该信号相连的槽会被调用。以下是信号槽的简单示例:
import sys from PyQt5.QtWidgets import QWidget, QPushButton, QApplication, QMessageBox class SignalExample1(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.btn = QPushButton("大师码按钮", self) # 定义一个按钮控件并显示文本 self.btn.move(100, 100) # 移动按钮到窗口坐标(100, 100) # 当鼠标点击按钮时,就会触发clicked信号 self.btn.clicked.connect(self.buttonClicked) # 将 clicked 信号关联到消息处理的槽函数 # 设置窗口的位置和大小,前两个参数表示离屏幕左上角的坐标,后两个参数表示窗口的大小 self.setGeometry(300, 300, 500, 500) self.setWindowTitle('SignalExample2') # 设置窗口的标题 self.show() # 显示窗口 def buttonClicked(self): # 槽函数,该功能是将按钮中的文本传入到弹出框,可以自定义各种消息 QMessageBox.information(None, "弹出框", self.btn.text()) # QMessageBox的框类型有如下几个: # information:消息对话框 # question:问答对话框 # warning:警告对话框 # critical:严重错误对话框 # about:关于对话框 app = QApplication(sys.argv) # 创建应用程序 ex = SignalExample1() # 创建窗口对象 sys.exit(app.exec_()) # 设置关闭窗口后结束进程
上述例子中,一但触发了QPushButton 控件的点击事件,则会自动调用buttonClicked()函数。
上述例子只是做了信号(clicked 消息发出的信号)和槽的关联,以及槽函数的处理。而对于 clicked 消息的投递则是 PyQt5 默认处理的。
同样,对于这种常见的消息(点击消息,移动鼠标消息,键盘输入消息等等), PyQt5 都有默认的投递行为。
拓展练习:尝试更改按钮控件的文本,观察弹出框是否也改变了。
小结 #
习题 #
- 习题1:尝试自定义槽函数buttonClicked显示的消息内容。