【PyQt】(自制类)处理鼠标点击逻辑

本文介绍了一个PyQt自定义类,用于简化鼠标事件处理,包括点击类型(左键、中键、右键)、单击、双击、长按和鼠标移动检测,具备灵敏度和时长设置功能。然而,该类在多键按下情况下存在处理限制。
摘要由CSDN通过智能技术生成

写了个自认为还算不错的类,用于简化mousePressEventmouseMoveEventmouseReleaseEvent中的鼠标信息。

功能有以下几点:
  • 鼠标当前状态,包括鼠标左/中/右键和单击/双击/抬起
  • 鼠标防抖(仅超出一定程度时才判断鼠标发生了移动),灵敏度可设置;
  • 鼠标长按(在鼠标长按并且未发生移动时触发),时长可设置;
  • 鼠标双击(两次点击的时间间隔足够小时判断为双击),时长可设置;
  • 鼠标偏移量,仅鼠标按下时有效,可返回自点击时的总偏移量,也可返回与上次鼠标事件之间的相对偏移量
补充:

这个自制类在多键按下时会产生歧义,也就是没法处理有如刁难一般的操作,像是右键拖拽然后左键来添乱之类的。本来是想再重新写份代码以填补这个缺陷的,但想想就有点怪,什么场合下才需要满足这种怪异的操作。




自制类XJ_MouseStatus

#XJ_MouseStatus.py
from PyQt5.QtCore import pyqtSignal
from PyQt5.QtCore import QPoint,Qt,QObject
from PyQt5.QtGui import QMouseEvent

__all__=['XJ_MouseStatus']
class XJ_MouseStatus(QObject):#mousePressEvent、mouseMoveEvent和mouseReleaseEvent特供。只处理单键(多键行为请在外部代码控制)
    longClick=pyqtSignal()#鼠标原地不动长按时触发

    __antiJitter=5#防抖,当鼠标点击位置与鼠标当前位置的曼哈顿距离不超过该值时仍将鼠标视为不动状态
    __doubleClickInterval=500#双击间隔(ms)
    __longPressInterval=500#长按间隔(ms)
    __record={
   
        'lastPress':None,#上一次按下时的信息
        'lastMouse':None,#上一次的鼠标信息
        'currMouse':None,#当前鼠标信息
        }
    __press=[QMouseEvent.MouseButtonRelease,QMouseEvent.MouseButtonPress,QMouseEvent.MouseButtonDblClick]#偷懒用的
    __move=False#用于判断是否长按
    __timerID=0#鼠标按下时对应的定时器
    class __Data:
        pos=None#鼠标位置
        btn=None#鼠标按键(左中右)
        pressStatus=None#鼠标当前按下状态(单双击/抬起)
        timeStamp=None#鼠标事件时间刻
        def __init__(self,event):
            self.pos=event.globalPos()#这里不用pos是为了防暴毙
            self.btn=event.button()
            self.pressStatus=event.MouseButtonRelease
            self.timeStamp=event.timestamp()

    def __init__(self,*arg):
        super().__init__(*arg)
        record=self.__record.copy()
        fakeEvent=QMouseEvent(QMouseEvent.MouseButtonRelease,QPoint(0,0),Qt.NoButton,Qt.NoButton,Qt.NoModifier)
        data=self.__Data(fakeEvent)
        data.timeStamp-=self
实现列表鼠标点击操作,可以通过继承 `QListWidget` 并重写 `mousePressEvent` 方法来实现。具体实现步骤如下: 1. 创建一个自定义的 `ListWidget` ,继承自 `QListWidget`。 ```python from PyQt5.QtWidgets import QListWidget, QListWidgetItem class ListWidget(QListWidget): def __init__(self, parent=None): super().__init__(parent) ``` 2. 重写 `mousePressEvent` 方法,捕获鼠标点击事件。 ```python class ListWidget(QListWidget): def __init__(self, parent=None): super().__init__(parent) def mousePressEvent(self, event): if event.button() == Qt.LeftButton: item = self.itemAt(event.pos()) if item is not None: print(item.text()) super().mousePressEvent(event) ``` 在 `mousePressEvent` 方法中,首先判断鼠标点击的是左键,然后获取当前点击的项,最后输出项的文本内容。 完整代码示例: ```python from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QApplication, QListWidget, QListWidgetItem class ListWidget(QListWidget): def __init__(self, parent=None): super().__init__(parent) def mousePressEvent(self, event): if event.button() == Qt.LeftButton: item = self.itemAt(event.pos()) if item is not None: print(item.text()) super().mousePressEvent(event) if __name__ == '__main__': app = QApplication([]) widget = ListWidget() widget.addItem(QListWidgetItem("Item 1")) widget.addItem(QListWidgetItem("Item 2")) widget.addItem(QListWidgetItem("Item 3")) widget.show() app.exec_() ``` 运行程序后,单击列表项可以在控制台中输出对应项的文本内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值