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

 大家好,我是小白小帅,在编写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)

实现思路及原理就是监控指定控件上鼠标行为,继而对鼠标行为进行处理,实现不同功能

  • 17
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用QPropertyAnimation来实现pyqt5的翻转动画切换显示stackedwidget。以下是示例代码: ```python from PyQt5.QtCore import QPropertyAnimation, QRect from PyQt5.QtWidgets import QApplication, QStackedWidget, QWidget, QVBoxLayout, QPushButton class FlipWidget(QWidget): def __init__(self, parent=None): super(FlipWidget, self).__init__(parent) self.frontWidget = QWidget(self) self.backWidget = QWidget(self) self.frontWidget.setStyleSheet("background-color: red;") self.backWidget.setStyleSheet("background-color: blue;") self.frontWidget.setGeometry(0, 0, 200, 200) self.backWidget.setGeometry(0, 0, 200, 200) self.frontWidget.show() self.backWidget.hide() self.animation = QPropertyAnimation(self, b"geometry") self.animation.setDuration(500) self.animation.setStartValue(QRect(0, 0, 200, 200)) self.animation.setEndValue(QRect(0, 0, 200, 200)) self.animation.setKeyValueAt(0.5, QRect(100, 0, 0, 200)) self.animation.finished.connect(self.flip) self.isFlipped = False def flip(self): if self.isFlipped: self.frontWidget.show() self.backWidget.hide() else: self.frontWidget.hide() self.backWidget.show() self.isFlipped = not self.isFlipped def startAnimation(self): self.animation.start() class MainWindow(QWidget): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.stack = QStackedWidget(self) self.stack.addWidget(FlipWidget(self.stack)) self.stack.addWidget(FlipWidget(self.stack)) self.stack.addWidget(FlipWidget(self.stack)) self.stack.addWidget(FlipWidget(self.stack)) self.stack.setCurrentIndex(0) layout = QVBoxLayout(self) layout.addWidget(self.stack) button = QPushButton("Next", self) button.clicked.connect(self.next) layout.addWidget(button) def next(self): index = self.stack.currentIndex() if index == self.stack.count() - 1: index = 0 else: index += 1 self.stack.setCurrentIndex(index) self.stack.currentWidget().startAnimation() if __name__ == "__main__": app = QApplication([]) window = MainWindow() window.show() app.exec_() ``` 这个示例代码演示了如何使用QPropertyAnimation实现翻转动画切换显示stackedwidget。在这个示例,我们创建了一个FlipWidget类,它包含了两个QWidget:frontWidget和backWidget。我们使用QPropertyAnimation来控制FlipWidget的geometry属性,从而实现翻转动画。在FlipWidget的flip方法,我们根据当前的状态来显示或隐藏frontWidget和backWidget。在MainWindow,我们创建了一个QStackedWidget,并将多个FlipWidget添加到其。我们还添加了一个按钮,用于切换当前显示的FlipWidget

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值