大家好,我是小白小帅,在编写pyqt5程序时,发现StackedWidget控件自身无法实现左右滑动切换页面的功能,所以自己封装了一个功能类,直接上完整代码
from PyQt5 import QtCore
class StackedWidgetMouseTracker(QtCore.QObject):
def __init__(self, stacked_widget):
super().__init__()
self._stacked_widget = stacked_widget # 存储 stackedWidget 对象
self._last_pos = None # 上一个鼠标位置
self._pressed_pos = None # 按下鼠标时的位置
self._dragging = False # 是否正在拖拽
# 监听 stackedWidget 的鼠标按下和释放事件
self._stacked_widget.mousePressEvent = self._mouse_press_event
self._stacked_widget.mouseReleaseEvent = self._mouse_release_event
def _mouse_press_event(self, event):
if event.button() == QtCore.Qt.LeftButton: # 判断是否左键按下
self._pressed_pos = event.pos() # 记录按下时的位置
self._last_pos = self._pressed_pos # 初始化上一个位置
self._dragging = True # 标记正在拖拽
def _mouse_release_event(self, event):
if event.button() == QtCore.Qt.LeftButton and self._dragging: # 判断是否左键释放,且正在拖拽
release_pos = event.pos() # 获取释放时的位置
distance = release_pos - self._pressed_pos # 计算鼠标移动距离
distance_length = distance.manhattanLength() # 曼哈顿距离,即一个向量各维度上绝对值之和
self._dragging = False # 结束拖拽
# print(f"拖动距离: {distance_length}")
if distance_length > 50: # 判断移动距离是否达到阈值
if distance.x() > 50 or distance.y() > 50: # 判断向右或向下移动
self.swipeRight() # 执行向右或向下切换操作
elif distance.x() < -50 or distance.y() < -50: # 判断向左或向上移动
self.swipeLeft() # 执行向左或向上切换操作
else:
print("鼠标移动得不够远")
def swipeLeft(self):
currentIndex = self._stacked_widget.currentIndex() # 获取当前活动页面的索引
if currentIndex + 1 < self._stacked_widget.count(): # 判断是否还有下一个页面
self._stacked_widget.setCurrentIndex(currentIndex + 1) # 切换到下一个页面
def swipeRight(self):
currentIndex = self._stacked_widget.currentIndex() # 获取当前活动页面的索引
if currentIndex > 0: # 判断是否还有上一个页面
self._stacked_widget.setCurrentIndex(currentIndex - 1) # 切换到上一个页面
def reset(self):
self._last_pos = None # 重置上一个位置
self._pressed_pos = None # 重置按下鼠标时的位置
self._dragging = False # 取消拖拽标记
使用方法如下,直接将需要实现滑动切换页面的StackedWidget控件传入即可
StackedWidgetMouseTracker(stacked_widget=self.StackedWidget)
实现思路及原理就是监控指定控件上鼠标行为,继而对鼠标行为进行处理,实现不同功能