博客
关于我
QT界面操作1:如何跟踪鼠标位置?
阅读量:795 次
发布时间:2023-03-03

本文共 2131 字,大约阅读时间需要 7 分钟。

一、可预见事件

在Qt编程中,事件是程序与用户交互的桥梁。许多操作,如按钮点击、鼠标移动、键盘按键按下等,都会触发特定的事件。这些事件的处理是程序流逻辑的重要组成部分。所有的QWidget都有潜力接收和处理这些事件。

键盘事件

键盘事件是最常见的事件类型之一。例如,按下Ctrl+A,按下Enter等键盘操作都会触发对应的键盘按键按下事件(keyPressEvent())。

鼠标事件

鼠标事件同样丰富多样。包括鼠标指针的移动(mouseMoveEvent()),鼠标左/右键按下(mousePressEvent()),滚动事件(wheelEvent())等。这些事件的处理可以实现复杂的鼠标交互功能。

拖放事件

拖放事件是指使用鼠标进行对象移动或重组的操作。例如,在桌面上拖动文件或图标会触发拖放事件(dragMoveEvent())。

滚轮事件

滚轮事件主要用于处理鼠标滚动动作,如在网页中滚动查看内容。滚动事件(scrollEvent())通常用于调整视口的缩放或滚动位置。

绘屏事件

绘屏事件(paintEvent())用于绘制Widget的内容。这个事件会自动触发,除非程序主动阻止。绘屏事件通常用于绘制自定义图形或UI界面。

定时事件

定时事件是通过定时器(QTimer)设置的。定时器到时会触发定时事件(timerEvent()),可以用来实现周期性任务或延迟操作。

焦点事件

焦点事件(focusEvent())主要与键盘输入相关。例如,按下Tab键时,焦点可能会从一个Widget切换到另一个Widget。

进入和离开事件

进入事件(enterEvent())和离开事件(leaveEvent())分别发生在鼠标指针进入Widget时和离开Widget时。这些事件可以用来实现悬停效果或其他动态交互。

移动事件

移动事件(moveEvent())用于响应Widget的位置变化。例如,窗口被拖动时,移动事件会通知Widget的位置变化。

大小改变事件

大小改变事件(sizeChangeEvent())用于响应Widget的宽高发生变化。可以用来调整布局或响应窗口缩放。

显示和隐藏事件

显示事件(showEvent())和隐藏事件(hideEvent())分别发生在Widget显示和隐藏时。这些事件可以用来执行显示或隐藏相关的初始化操作。

窗口事件

窗口事件(windowEvent())是一个通用的事件类型,用于处理与窗口相关的操作。例如,判断当前窗口是否为主窗口(isActiveWindow())。

二、概括性事件——QObject事件

在Qt中,所有事件都可以通过QObject::event()接口来处理。这个接口能够获取到发生的事件类型,并允许开发者自定义事件处理逻辑。某些事件可以通过重载事件处理函数(如paintEvent()、mousePressEvent()等)来处理。

事件处理的优先级遵循一定的规则:操作系统会根据事件类型和优先级决定处理顺序。例如,高优先级事件可能会覆盖低优先级事件。

三、鼠标追踪

3.1 基本代码

在本代码中,我们主要实现了一个简单的鼠标追踪功能。以下是实现代码:

import sys
from PyQt5.QtCore import (QEvent, QTimer, Qt)
from PyQt5.QtWidgets import (QApplication, QMenu, QWidget)
from PyQt5.QtGui import QPainter
class Widget(QWidget):
def __init__(self, parent=None):
super(Widget, self).__init__(parent)
self.resize(1200, 800)
self.move(100, 100)
self.setWindowTitle("Events")
self.setMouseTracking(True)
if __name__ == "__main__":
app = QApplication(sys.argv)
form = Widget()
form.show()
app.exec_()

3.2 鼠标位置追踪

为了实现鼠标位置的追踪,我们在Widget类中添加了鼠移事件处理函数:

def mouseMoveEvent(self, event):
globalPos = self.mapToGlobal(event.pos())
x = globalPos.x()
y = globalPos.y()
print(x, y)

但这个实现存在一个问题:当鼠标不按下时,不能追踪鼠标的位置。要实现不按下鼠标时也能追踪鼠标位置,我们需要在Widget初始化时设置:

self.setMouseTracking(True)

这样,鼠标移动时都会触发鼠移事件,即使鼠标不按下也能追踪鼠标的位置。

转载地址:http://tcxfk.baihongyu.com/

你可能感兴趣的文章
Quartz中时间表达式的设置-----corn表达式
查看>>
poj 1035
查看>>
POJ 1061 青蛙的约会 (扩展欧几里得)
查看>>
Quartz2.2.1简单使用
查看>>
POJ 1080 Human Gene Functions(DP:LCS)
查看>>
Quant 开源项目教程
查看>>
POJ 1088 滑雪
查看>>
POJ 1095 Trees Made to Order
查看>>
POJ 1113 Wall(计算几何--凸包的周长)
查看>>
poj 1125Stockbroker Grapevine(最短路)
查看>>
Qualitor processVariavel.php 未授权命令注入漏洞复现(CVE-2023-47253)
查看>>
poj 1151 (未完成) 扫描线 线段树 离散化
查看>>
POJ 1151 / HDU 1542 Atlantis 线段树求矩形面积并
查看>>
poj 1163 数塔
查看>>
POJ 1177 Picture(线段树:扫描线求轮廓周长)
查看>>
Qualitor checkAcesso.php 任意文件上传漏洞复现(CVE-2024-44849)
查看>>
POJ 1182 食物链(并查集拆点)
查看>>
POJ 1185 炮兵阵地 (状态压缩DP)
查看>>
POJ 1195 Mobile phones
查看>>
POJ 1228 Grandpa's Estate (稳定凸包)
查看>>