首页 > 其他分享 >PyQt5 使用 QFrame 实现页面类抽屉式的进入与退出的动画

PyQt5 使用 QFrame 实现页面类抽屉式的进入与退出的动画

时间:2024-09-27 23:04:23浏览次数:8  
标签:opacity 动画 self PyQt5 Window animation 抽屉式 QFrame

PyQt5 使用 QFrame 实现页面类抽屉式的进入与退出的动画

当多个页面切换,但是又不想每个页面里的内容只是简单的出现与消失,则可以使用这个QPropertyAnimation动画

代码结构

本文中全部代码全在test_QFrame_Animation.py这一个文件中编码,步骤中有变动的地方会注释标注,无改动的不会重复显示出来,需要看完整代码的,可直接移步到末尾。

一. 创建测试页面

添加QFrame,用于实现动画效果,并添加两个QPushButton按钮,用于提供触发信号

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@ File        : test_QFrame_Animation.py
@ Author      : yqbao
@ Version     : V1.0.0
@ Description : QFrame 实现页面类抽屉式的进入与退出的动画
"""
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QFrame, QGraphicsOpacityEffect
from PyQt5.QtCore import QRect, QPropertyAnimation


class Ui_Window(object):
    def setupUi(self, Window):
        Window.setObjectName("Window")
        Window.resize(800, 200)

        # 创建按钮触发进入动画
        self.start_button = QPushButton(Window)
        self.start_button.setText("进入")
        self.start_button.setGeometry(QRect(330, 10, 130, 23))

        # 创建按钮触发退出动画
        self.exit_button = QPushButton(Window)
        self.exit_button.setText("退出")
        self.exit_button.setGeometry(QRect(330, 40, 130, 23))

        # 创建QFrame并设置初始位置在窗口下方位置70
        self.frame = QFrame(Window)
        self.frame.setGeometry(50, 70, 700, 120)  # 初始位置为 x=50,y=70
        self.frame.setStyleSheet("background-color: lightblue;")  # 背景色

测试页面如图:
image

二. 设置QFrame的初始状态

启动图形透明度,并设置QFrame,初始透明度为完全透明

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@ File        : test_QFrame_Animation.py
@ Author      : yqbao
@ Version     : V1.0.0
@ Description : QFrame 实现页面类抽屉式的进入与退出的动画
"""

class Ui_Window(object):
    ...  # 忽略,无改动


class Window(QWidget, Ui_Window):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        # 设置 QFrame 为透明,然后后续在动画中,边修改透明度边移动
        self.opacity_effect = QGraphicsOpacityEffect()
        self.frame.setGraphicsEffect(self.opacity_effect)
        self.opacity_effect.setOpacity(0)  # 初始透明度为0(完全透明)

此时无法看见QFrame但其实他就在那个位置。
image

三. 为QFrame添加属性动画

添加两个方法,分别实现进入与退出效果,其中动画的主要作用就是修改QFrame的位置与透明度,其中修改位置时,xy坐标遵循的是左上角x=0,y=0,右下角x=高度,y=宽度,所以x越大,位置越靠近右侧,y越大,位置越靠近底部,

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@ File        : test_QFrame_Animation.py
@ Author      : yqbao
@ Version     : V1.0.0
@ Description : QFrame 实现页面类抽屉式的进入与退出的动画
"""

class Ui_Window(object):
    ...  # 忽略,无改动


class Window(QWidget, Ui_Window):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        ...  # 忽略,无改动

        # 增加 按钮点击信号连接
        self.start_button.clicked.connect(self.start_animation)
        self.exit_button.clicked.connect(self.exit_animation)

    def start_animation(self):
        # 设置QFrame的geometry属性
        self.move_animation = QPropertyAnimation(self.frame, b"geometry")
        self.move_animation.setDuration(200)  # 动画持续时间为200ms
        self.move_animation.setStartValue(QRect(50, 110, 700, 120))  # 动画开始时的位置
        self.move_animation.setEndValue(QRect(50, 70, 700, 120))  # 动画结束时的位置

        # 设置QFrame的透明度属性
        self.opacity_animation = QPropertyAnimation(self.opacity_effect, b"opacity")
        self.opacity_animation.setDuration(200)  # 动画持续时间为200ms
        self.opacity_animation.setStartValue(0)  # 动画开始时的透明度(完全透明)
        self.opacity_animation.setEndValue(1)  # 动画结束时的透明度(完全不透明)

        # 启动动画
        self.move_animation.start()
        self.opacity_animation.start()

    def exit_animation(self):
        # 设置QFrame的geometry属性
        self.move_animation = QPropertyAnimation(self.frame, b"geometry")
        self.move_animation.setDuration(200)  # 动画持续时间为200ms
        self.move_animation.setStartValue(QRect(50, 70, 700, 120))  # 动画开始时的位置
        self.move_animation.setEndValue(QRect(50, 110, 700, 120))  # 动画结束时的位置

        # 设置QFrame的透明度属性
        self.opacity_animation = QPropertyAnimation(self.opacity_effect, b"opacity")
        self.opacity_animation.setDuration(200)  # 动画持续时间为200ms
        self.opacity_animation.setStartValue(1)  # 动画开始时的透明度(完全不透明)
        self.opacity_animation.setEndValue(0)  # 动画结束时的透明度(完全透明)

        # 启动动画
        self.move_animation.start()
        self.opacity_animation.start()

效果为从下往上进入,与从上向下退出:
image

四. 完整代码

随便在QFrame中添加一些小部件,使其一起出现与退出

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@ File        : test_QFrame_Animation.py
@ Author      : yqbao
@ Version     : V1.0.0
@ Description : QFrame 实现页面类抽屉式的进入与退出的动画
"""
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QFrame, QGraphicsOpacityEffect
from PyQt5.QtCore import QRect, QPropertyAnimation


class Ui_Window(object):
    def setupUi(self, Window):
        Window.setObjectName("Window")
        Window.resize(800, 200)

        # 创建按钮触发进入动画
        self.start_button = QPushButton(Window)
        self.start_button.setText("进入")
        self.start_button.setGeometry(QRect(330, 10, 130, 23))

        # 创建按钮触发退出动画
        self.exit_button = QPushButton(Window)
        self.exit_button.setText("退出")
        self.exit_button.setGeometry(QRect(330, 40, 130, 23))

        # 创建QFrame并设置初始位置在窗口下方位置70
        self.frame = QFrame(Window)
        self.frame.setGeometry(50, 70, 700, 120)  # 初始位置为 x=50,y=70
        self.frame.setStyleSheet("background-color: lightblue;")  # 背景色


class Window(QWidget, Ui_Window):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        # 设置 QFrame 为透明,然后后续在动画边修改透明度,边移动
        self.opacity_effect = QGraphicsOpacityEffect()
        self.frame.setGraphicsEffect(self.opacity_effect)
        self.opacity_effect.setOpacity(0)  # 初始透明度为0(完全透明)

        self.start_button.clicked.connect(self.start_animation)
        self.exit_button.clicked.connect(self.exit_animation)

    def start_animation(self):
        # 设置QFrame的geometry属性
        self.move_animation = QPropertyAnimation(self.frame, b"geometry")
        self.move_animation.setDuration(200)  # 动画持续时间为200ms
        self.move_animation.setStartValue(QRect(50, 110, 700, 120))  # 动画开始时的位置
        self.move_animation.setEndValue(QRect(50, 70, 700, 120))  # 动画结束时的位置

        # 设置QFrame的透明度属性
        self.opacity_animation = QPropertyAnimation(self.opacity_effect, b"opacity")
        self.opacity_animation.setDuration(200)  # 动画持续时间为200ms
        self.opacity_animation.setStartValue(0)  # 动画开始时的透明度(完全透明)
        self.opacity_animation.setEndValue(1)  # 动画结束时的透明度(完全不透明)

        # 启动动画
        self.move_animation.start()
        self.opacity_animation.start()

    def exit_animation(self):
        # 设置QFrame的geometry属性
        self.move_animation = QPropertyAnimation(self.frame, b"geometry")
        self.move_animation.setDuration(200)  # 动画持续时间为200ms
        self.move_animation.setStartValue(QRect(50, 70, 700, 120))  # 动画开始时的位置
        self.move_animation.setEndValue(QRect(50, 110, 700, 120))  # 动画结束时的位置

        # 设置QFrame的透明度属性
        self.opacity_animation = QPropertyAnimation(self.opacity_effect, b"opacity")
        self.opacity_animation.setDuration(200)  # 动画持续时间为200ms
        self.opacity_animation.setStartValue(1)  # 动画开始时的透明度(完全不透明)
        self.opacity_animation.setEndValue(0)  # 动画结束时的透明度(完全透明)

        # 启动动画
        self.move_animation.start()
        self.opacity_animation.start()


if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    w = Window()
    w.show()
    sys.exit(app.exec_())

本文章的原文地址
GitHub主页

标签:opacity,动画,self,PyQt5,Window,animation,抽屉式,QFrame
From: https://www.cnblogs.com/yqbaowo/p/18436594

相关文章

  • PyQt项目实战-(Pyqt5+mysql制作一个TODO清单 第一部分)
    PyQt项目实战Pyqt5实现todolist工作待办的增、改、删、查功能,连接mysql存储数据(待办事项)。目录目录        1.界面设计    2.功能实现    3.界面各Button点击事件和槽函数的链接    4.mysql数据库操作工具类    5.槽函数实现......
  • PyQt5 使用 QLabel 实现对图片圆角或者圆形图片
    PyQt5使用QLabel实现对图片圆角或者圆形图片本文圆角实现代码,是基于Qt处理图片:设置图片圆角样式,支持全圆角和部分圆角这篇文章将C++用Python重写得到,感谢!!实现方法就是使用QPainter与QPainterPath,将原QPixmap对象,先裁剪出一个圆角QPixmap对象并返回,最后通过QLabel的setPixmap......
  • Pyqt5 修改表格排序箭头
    实现效果:代码fromchatgptimportsysfromPyQt5.QtWidgetsimportQApplication,QTableWidget,QTableWidgetItem,QVBoxLayout,QWidgetfromPyQt5.QtCoreimportQtclassTableDemo(QWidget):def__init__(self):super().__init__()#创建表......
  • 【Python-GUI图形化界面-PyQt5模块(2)】——QApplication核心模块
     本文旨在带大家学习Python中的一种GUI图形化界面模块——PyQt5模块,将为大家详细了解PyQt5模块中函数的参数和使用:一、PyQt5简介PyQt是Qt框架的Python语言实现,由RiverbankComputing开发,是最强大的GUI库之一。官方网站:www.riverbankcomputing.com、 本文比较倾向于教会......
  • PyQt5 中的强大工具 ——QTextEdit 富文本框
    在PyQt5的世界里,QTextEdit是一个功能强大的富文本框组件,它为开发者提供了丰富的文本编辑和展示功能。本文将深入探讨PyQt5中的QTextEdit,带你领略其强大之处。一、引言在现代图形用户界面(GUI)应用程序中,富文本编辑功能是不可或缺的一部分。无论是编写文档、编辑邮件还......
  • PyQt5 使用 QStackedWidget 实现轮播展示动画,但是却疯狂闪烁的解决办法
    PyQt5使用QStackedWidget实现轮播展示动画,但是却疯狂闪烁的解决办法上篇说到,上篇见这里我们可能会遇到,当把鼠标移动到"下一页"和"上一页"按钮,又或者是Qlabel标签页时,就会疯狂闪烁,于是在这里换另一种方案,解决这个问题代码结构本文基于上篇,上篇见这里修改而来,全部代码......
  • PyQt5 使用 QStackedWidget 实现轮播展示动画(自动与手动)
    PyQt5使用QStackedWidget实现轮播展示动画(自动与手动)在PyQt5中,如果需要用QStackedWidget展示图片比较生硬,参考网络上的一些内容,发现用QPropertyAnimation属性动画可实现想要的效果,于是记录在这里代码结构本文中全部代码全在test_QStackedWidget_Animation.py这一个文件中......
  • PyQt5 使用 QFrame 绘制聊天(三角)气泡,并显示文字
    PyQt5使用QFrame绘制聊天(三角)气泡,并显示文字在PyQt5中,当需要想得到一个自定义的聊天气泡时,可以使用QPainter进行自定义绘制代码如下使用QPainter进行自定义绘制#!/usr/bin/envpython3#-*-coding:UTF-8-*-"""@File:test_QFrame.py@Author:......
  • PyQt5--打造精美、功能强大的桌面应用程序
    ui文件转换为python文件方法一:直接使用命令行转换,demo.ui为保存的ui名,demo.py为ui转换为python的文件。1python-mPyQt5.uic.pyuicdemo.ui-odemo.py QLabel案例:使用信号以下是QLabel控件的常用信号:linkActivated:当控件中包含超链接时,用户单击链接时触发此信号。......
  • 【看来我要63岁才能退休了】超简单!低耦合!一步在自己PyQt5、PySide6界面中加入文件资源
    【......