跳至正文
View Categories

< 1 min read

    主要内容 #

  1. Event介绍
  2. 信号槽介绍

完成效果 #

完成本节课程,能了解PyQt5的事件,信号槽处理。
效果如下:

收获 #

学习完本节内容,我们会知道什么是事件,以及信号槽机制如何处理事件。

1.Event介绍 #

所有的应用都是事件驱动的。事件大部分都是由用户的行为产生的,当然也有其他的事件产生方式,比如网络的连接,窗口管理器或者定时器等。
调用应用的exec_()方法时,应用会进入主循环,主循环会监听和分发事件。
在事件模型中,有三个角色:

  1. 事件源
  2. 事件对象
  3. 事件目标

事件源就是发生了状态改变的对象,它产生了事件。事件对象(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. 习题1:尝试自定义槽函数buttonClicked显示的消息内容。