写了个自认为还算不错的类,用于简化mousePressEvent
、mouseMoveEvent
和mouseReleaseEvent
中的鼠标信息。
功能有以下几点:
鼠标当前状态
,包括鼠标左/中/右键和单击/双击/抬起鼠标防抖
(仅超出一定程度时才判断鼠标发生了移动),灵敏度可设置;鼠标长按
(在鼠标长按并且未发生移动时触发),时长可设置;鼠标双击
(两次点击的时间间隔足够小时判断为双击),时长可设置;鼠标偏移量
,仅鼠标按下时有效,可返回自点击时的总偏移量,也可返回与上次鼠标事件之间的相对偏移量
补充:
这个自制类在多键按下时会产生歧义,也就是没法处理有如刁难一般的操作,像是右键拖拽然后左键来添乱之类的。本来是想再重新写份代码以填补这个缺陷的,但想想就有点怪,什么场合下才需要满足这种怪异的操作。
自制类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