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

news/2025/1/15 20:46:10/文章来源:https://www.cnblogs.com/yqbaowo/p/18436594

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, QPropertyAnimationclass 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并设置初始位置在窗口下方位置70self.frame = QFrame(Window)self.frame.setGeometry(50, 70, 700, 120)  # 初始位置为 x=50,y=70self.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)  # 动画持续时间为200msself.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)  # 动画持续时间为200msself.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)  # 动画持续时间为200msself.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)  # 动画持续时间为200msself.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, QPropertyAnimationclass 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并设置初始位置在窗口下方位置70self.frame = QFrame(Window)self.frame.setGeometry(50, 70, 700, 120)  # 初始位置为 x=50,y=70self.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)  # 动画持续时间为200msself.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)  # 动画持续时间为200msself.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)  # 动画持续时间为200msself.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)  # 动画持续时间为200msself.opacity_animation.setStartValue(1)  # 动画开始时的透明度(完全不透明)self.opacity_animation.setEndValue(0)  # 动画结束时的透明度(完全透明)# 启动动画self.move_animation.start()self.opacity_animation.start()if __name__ == "__main__":import sysapp = QApplication(sys.argv)w = Window()w.show()sys.exit(app.exec_())

本文章的原文地址
GitHub主页

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/804851.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为云技术专家分享4大举措,助力开发者开启鸿蒙原生应用开发

鸿蒙生态是面向全场景时代的新生态,为开发者带来新价值新机遇。本文分享自华为云开发者联盟公众号《DTSE Tech Talk | 第66期:鸿蒙上云,加速开发者成长。》 本期DTSE Tech Talk直播主题是《鸿蒙上云,加速开发者成长》,华为云HarmonyOS DTSE技术布道师芝诺在本议题中与开发…

动手动脑01

动手动脑01 重新编写java测试00 Planinformation public class PlanInformation { // 变量id为整型,表示日报流水号,依次加一。 // 变量planid 为字符串类型 String,表示产品生产批次号(例如:2312-110,有8 位字符组成,前四位表示年月,后三位表示序号)。 // 变…

黑马PM-内容项目-用户端产品设计

引导页&启动页&闪屏页用户端设计思路注册登录内容发布内容列表&内容详情内容分发个人中心

实现一个自动生成小学四则运算题目的命令行程序

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13230这个作业的目标 实现一个自动生成小学四则运算题目的命令行程序项目成员 本结对项目由 -- 3122004589 张逸程 --…

第一次结对作业102202106王强

第一次结对作业之需求分析和原型设计这个作业属于哪个课程 首页 - 软件工程2024 - 福州大学 - 班级博客 - 博客园这个作业要求在哪里 2024秋软件工程结对作业(第一次之需求分析和原型设计) - 作业 - 软件工程2024 - 班级博客 - 博客园这个作业的目标 结对作业,进行需求分析和…

C++ 容器赋值运算符

▲ 《C++ Primer》 P302

第34章 货币政策和财政政策对总需求的影响

货币政策如何影响总需求 对美国经济来说,总需求曲线向右下方倾斜的最重要原因是利率效应。流动性偏好理论(theory of liquidity preference):凯恩斯提出的理论,认为利率的调整会使货币供给与货币需求达到平衡第一部分 货币供给 货币供给量由美联储的政策所固定,因此它不取…

标准库之 datetime和time 模块

一、time 模块 time模块是Python标准库中最基础、最常用的模块之一。它提供了各种处理时间的方法和函数,如获取当前时间、格式化时间、计算时间差等。time模块大部分函数的底层实现是 C 语言库的时间处理函数。 1.1、获取时间相关函数 1.1.1、time.time()函数 时间戳是指格林威…

一次实践:给自己的手机摄像头进行相机标定

记录了一次给自己的手机摄像头进行相机标定的技术实践。目录1. 问题引入2. 准备工作2.1 标定场2.2 相机拍摄3. 基本原理3.1 成像原理3.2 畸变校正4. 标定解算4.1 代码实现4.2 详细解析4.2.1 解算实现4.2.2 提取点位4.3 解算结果5. 问题补充 1. 问题引入 不得不说,现在的计算机…

第33章 总需求与总供给

衰退(recession):真实收入下降和失业增加的时期 萧条(depression):严重的衰退关于经济波动的三个关键事实经济波动是无规律的且不可预测的 大多数宏观经济变量同时波动 随着产量的减少,失业增加解释短期经济波动 古典经济学:古典二分法和货币中性。货币供给的变动影响名…

ISO/IEC/IEEE 29119-1:2022(E) 系统与软件工程软件测试第1部分:概念和定义

0 前言 国际标准化组织(ISO the International Organization for Standardization)和国际电工委员会(IEC the International Electrotechnical Commission)构成了世界标准化的专门体系。作为国际标准化组织或国际电工委员会成员的国家机构通过各自组织设立的技术委员会参与…

软件工程2024第一次结对作业

这个作业属于哪个课程 fzu-se2024这个作业要求在哪里 要求这个作业的目标 学习软件开发的前期过程,构建软件工程雏形学号 102201331队友施靖杰 102201327 使用工具:墨刀 原型(SkillBridge)链接《构建之法》学习 第三章 软件工程师的成长 1.IC在团队中的开发流程通过交流、实…