什么是事件?
事件是程序收到外界的输入,处于某种状态时自动发送的信号。事件有固定的类型,每种类型有自己的处理函数,用户只要重写这些函数,即可达到特定的目的。通过事件可以用一个控件监测另外一个控件,并可过滤被监测控件发出的事件。
事件的类型与处理函数
事件的概念与实列
外界对PySide程序进行输入信息的过程称为事件,列如在窗口上单击鼠标,输入框中输入数据等,只要是外界对程序的输入,都可以称为事件。程序对外界的输入进行处理的过程称为事件处理,根据外界输入信息的不同,处理事件的函数也是不同的。
事件与信号/槽相似,但是又有不同。信号是指控件或窗口本身满足一定条件时,发送一个带数据的信息或不带数据的信息,需要编程人员为这个信息单独写处理这个信息的槽函数,并将信号和槽函数关联,发送信号时,自动执行与之关联的槽函数。而事件是外界对程序的输入,将外界的输入进行分类后交给函数处理,处理事件的函数是固定的,只需要编程人员把处理事件的函数重写,来达到处理外界输入的目的,而不需要将事件与处理事件的函数进行连接,系统会自动调用能处理事件的函数,并把相关数据作为实参传递给处理事件的函数。
下面是一个处理鼠标单击事件的程序,在窗口的空白处单击鼠标左键或右键,将会产生QMouseEvent
事件,QMouseEvent
事件的实例对象中有与鼠标事件相关的属性,如button()
方法获取单击的是左键还是右键。QWidget
窗口处理QMouseEvent
事件的函数有mouseDoubleClickEvent(QMouseEvent)
、mouseMoveEvent(QMouseEvent)
、mousePressEvent(QMouseEvent)
、mouseReleaseEvent(QMouseEvent)
和moveEvent(QMoveEvent)
。
import sys
from PySide6.QtWidgets import (QApplication,QMainWindow,QVBoxLayout,QHBoxLayout,QStackedLayout,QLineEdit,QPushButton,QWidget,QTabWidget,QLabel,QToolBar,QWidgetAction,QDialog,QMessageBox,
)
from PySide6.QtCore import Qt
from PySide6.QtGui import QIconclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.label = QLabel("Click in this window")self.setCentralWidget(self.label)def mousePressEvent(self, e): # 鼠标点击事件处理程序if e.button() == Qt.MouseButton.LeftButton:self.label.setText("mousePressEvent LEFT")elif e.button() == Qt.MouseButton.MiddleButton:self.label.setText("mousePressEvent MIDDLE")elif e.button() == Qt.MouseButton.RightButton:self.label.setText("mousePressEvent RIGHT")def mouseReleaseEvent(self, e): # 鼠标释放事件处理程序if e.button() == Qt.MouseButton.LeftButton:self.label.setText("mouseReleaseEvent LEFT")elif e.button() == Qt.MouseButton.MiddleButton:self.label.setText("mouseReleaseEvent MIDDLE")elif e.button() == Qt.MouseButton.RightButton:self.label.setText("mouseReleaseEvent RIGHT")def mouseDoubleClickEvent(self, e):if e.button() == Qt.MouseButton.LeftButton:self.label.setText("mouseDoubleClickEvent LEFT")elif e.button() == Qt.MouseButton.MiddleButton:self.label.setText("mouseDoubleClickEvent MIDDLE")elif e.button() == Qt.MouseButton.RightButton:self.label.setText("mouseDoubleClickEvent RIGHT")app = QApplication(sys.argv)
window = MainWindow()
window.show()app.exec()
QEvent类
QEvent类是所有事件的基类,它在QtCore模块中。外界输入给程序的信息首先交给QEvent进行分类,得到不同类型的事件,然后系统将事件及相关信息交给控件或窗口的事件处理函数进行处理,得到对外界输入的响应。QEvent类的属性只有accepted
。