pyqt5中StackedWidget实现触控滑动切换页面

328 阅读2分钟

1.直接上封装完成的功能类


#!/usr/bin/python
# -*- coding: UTF-8 -*-
from PyQt5 import QtCore
from PyQt5.QtWidgets import QStackedWidget, QApplication


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  # 取消拖拽标记


app = QApplication([])
stacked_widget = QStackedWidget()
# 增加 stackedWidget 的页面...
tracker = StackedWidgetMouseTracker(stacked_widget)
stacked_widget.show()
app.exec_()

2.使用方法如下,直接将需要实现滑动切换页面的StackedWidget控件传入即可

StackedWidgetMouseTracker(stacked_widget=self.StackedWidget)

3.实现思路及原理就是监控指定控件上鼠标行为,继而对鼠标行为进行处理,实现不同功能,以上代码可以现实需求扩展到对任意控件进行鼠标行为监控,以便实现不同功能