一般在处理单击、双击、拖动事件时会遇到以下问题:
- 双击时会产生两个额外的单击事件和两个释放事件
- 拖动时会在拖动开始处产生一个单击事件,在拖动结束时产生一个释放事件
故采用signal作为事件类型的标志加以区分。此处采用释放时生效单击事件。
用定时器等待双击事件,在时间内如果没有判断得到双击事件即为单击事件
# 实例化功能按钮
class button1(QPushButton):
def __init__(self, parent=None):
super(button1, self).__init__(parent)
self.setText("记事本")
self.resize(100, 100)
self.signal1 = 0 # 判断鼠标事件类型的标志
self.mousepos1 = 0 # 用于拖动时的鼠标位置初始值
self.timer = QTimer()
self.timer.timeout.connect(self.timerout1) # 定时器,初始化连接到timerout1函数
# 定义鼠标事件
def mouseDoubleClickEvent(self, QMouseEvent):
self.signal = 2
self.close()
def mouseMoveEvent(self, QMouseEvent):
# 定义窗口随鼠标移动方法1
if QMouseEvent.buttons() == Qt.LeftButton:
self.mousepos2 = QMouseEvent.screenPos()
self.toposx = int(self.frameGeometry().x() + self.mousepos2.x() - self.mousepos1.x())
self.toposy = int(self.frameGeometry().y() + self.mousepos2.y() - self.mousepos1.y())
self.move(self.toposx, self.toposy)
self.mousepos1 = self.mousepos2
self.signal1 = 3
def mousePressEvent(self, QMouseEvent):
if QMouseEvent.buttons() == Qt.LeftButton:
self.mousepos1 = QMouseEvent.screenPos()
# 采用按钮释放时相应点击事件
def mouseReleaseEvent(self, e: QtGui.QMouseEvent) -> None:
if self.signal1 == 0:
self.timer.start(1000)
self.signal1 = 1
elif self.signal1 == 3: # 拖动事件标志
self.signal1 = 0
# 定时器功能函数
def timerout1(self):
if self.signal1 == 1:
self.remember() # 单击事件处理函数
self.signal1 = 0