一、事件机制
1.1、Qt应用程序中的事件的来源
事件机制是PyQt5核心概念之一,掌握事件机制对于开发GUI应用程序至关重要。在 PyQt5中,事件机制用于处理应用程序与用户之间的交互。其中,事件可以是用户行 为,如按键、鼠标点击、移动窗口等。也可以是系统通知,如定时器触发、网络消息 到达等。
Qt中的事件来源于系统消息,经Qt平台(QApplication)转换封装为Qt事件。
Qt事件是一个QEvent对象。
系统消息主要是操作系统捕捉到的底层软、硬件信息,比如,触屏时触发中断,操作 系统将这个触屏的信息封装成系统消息发送到更上层的平台
QT的所有GUI程序都是事件驱动的。
1.2、QT事件处理机制
事件主要由用户触发(用户与界面交互),但也可能有其他触发方式:例如网络连 接、window manager或定时器。
例如:
用户移动鼠标,会产生鼠标移动事件
用户点击鼠标,会产生鼠标点击事件
用户滚动鼠标滑轮,会产生滑轮事件
用户键盘输入,会产生键盘输入事件
在事件模型中,有三个参与者:
事件源:是状态发生变化的对象
事件对象:封装了事件源中状态的变动
事件接收者: 是要通知的对象, 事件源对象将事件处理的工作交给事件接收者。
1.3、事件处理机制
Qt事件(QEvent对象)产生之后,会被分发到QWidget对象(QWidget是所有与用户 交互类的父类), 在QWidget的event(QEvent*) 函数中进行事件处理,该函数根据事件类型调用不同 的事件处理函数。
例如 : 用户操作鼠标去点击按钮, 有事件对象产生, 按钮对象中的 event() 事件分发函数被 触发,这个函数会根据 事件的类型来判断,如果是鼠标点击事件,就会调用按钮中的鼠标点击事件处理函数!
1.4、信号与事件关系
信号是在某一特定事件发生时被触发的
事件-> 对应控件的事件处理函数->触发信号->信号与槽函数关联->执行对应的槽函数
二、鼠标事件
2.1、鼠标点击事件
mousePressEvent()
根据按钮来判断:QMouseEvent.button()-> Qt.MouseButton 枚举
def mousePressEvent(self, a0):
# 获取鼠标点击的位置坐标
x = a0.x()
y = a0.y()
# 根据鼠标点击的位置更新Label的位置
self.label.move(x, y)
# 根据不同的按钮判断,输出不同的提示信息
if a0.button() == Qt.LeftButton:
print('点击的是左键')
elif a0.button() == Qt.RightButton:
print('点击的是右键')
elif a0.button() == Qt.MidButton:
print('点击的是中间键')
2.2、鼠标移动事件
mouseMoveEvent()
def mouseMoveEvent(self, a0):
print('鼠标移动到了')
x=a0.x()
y=a0.y()
self.pi_lab.setGeometry(x,y,200,200)
2.3、完整代码
import sys # 导入系统模块以处理命令行参数
from PyQt5.QtCore import Qt # 导入Qt核心功能
from PyQt5.QtWidgets import QWidget, QApplication, QLabel # 导入Qt小部件
from PyQt5.QtGui import QPixmap # 导入QPixmap用于处理图像
class Widge(QWidget): # 定义一个名为Widge的窗口类,继承自QWidget
def __init__(self):
super().__init__() # 调用父类的初始化方法
self.label = QLabel('鼠标点击事件', self) # 创建一个标签显示文本
self.label.move(100, 70) # 移动标签到指定的位置
self.pi_lab = QLabel(self) # 创建一个用于显示图像的QLabel
self.pi_lab.setGeometry(100, 120, 200, 200) # 设置图像标签的位置和大小
self.pi_lab.setPixmap(QPixmap('灯泡.jpg').scaled(self.pi_lab.size())) # 加载图像并调整大小
self.setMouseTracking(True) # 启用鼠标跟踪功能
def mousePressEvent(self, a0): # 鼠标按下事件
x = a0.x() # 获取鼠标点击的x坐标
y = a0.y() # 获取鼠标点击的y