PyQt介绍——动画使用详解之QPropertyAnimation

news/2024/5/19 10:30:56

一、继承关系

在这里插入图片描述
PyQt5的动画框架是QAbstractAnimation,它是一个抽象类,不能直接使用,需要使用它的子类。它的类结构如下:

  • QAbstractAnimation:抽象动画,是所有动画的基类,不能直接使用。

    • QVariantAnimation:值动画,用于改变控件的属性,比如改变控件的位置、大小、颜色等。
    • QPropertyAnimation:属性动画,用于改变控件的属性,比如改变控件的位置、大小、颜色等。
  • QAnimationGroup:动画组,可以包含多个动画,可以包含子动画组。

    • QSequentialAnimationGroup:顺序动画组,按照添加的顺序依次执行动画。
    • QParallelAnimationGroup:并行动画组,所有动画一起执行。

二、功能作用

循环操作

# 设置循环次数,count=-1,为无限循环
setLoopCount(count)
# 当前循环
currentLoop()
当前循环时间
currentLoopTime()

时间操作

# 单次时长
duration()
# 动画总时长
totalDuration()
# 当前时长
currentTime()

动画方向

setDirection(QAbstractAnimation.Forward/QAbstractAnimation.Backward)setDirection(QAbstractAnimation.Forward)  # 动画的当前时间随着时间增加
setDirection(QAbstractAnimation.Backward)  # 动画的当前时间随着时间减少

动画状态

动画状态的切换通过下面的常用操作来做:例如,当用户点击按钮的时候,动画停止,再次点击时动画继续。

# 动画停止
QAbstractAnimation.Stopped
# 动画暂停
QAbstractAnimation.Paused
# 动画运行
QAbstractAnimation.Runningdef btn_clicked_slot():if animation.state() == QAbstractAnimation.Running :animation.pause()elif animation.state() == QAbstractAnimation.Paused:animation.resume()# stop() 和pause() 的区别:它们都可以停止运行。stop() 是不可恢复的,pause() 是可以恢复的

常用信号

currentLoopChanged()
directionChanged()
finished()
stateChanged()

三、QPropertyAnimation属性动画的使用

定义动画的主要步骤:

  • 创建一个动画,并设置目标、属性

  • 设置属性值的开始、插值、结束

  • 动画时长

  • 启动动画

构造函数使用方式:

# 方法1:
QPropertyAnimation(parent: QObject = None)
setTargetObject(self, QObject)  # 设置动画目标
setPropertyName(self, Union[QByteArray, bytes, bytearray])  # 设置动画属性(位置、大小等):# 方法2:
QPropertyAnimation(QObject, Union[QByteArray, bytes, bytearray], parent: QObject = None)

**常见的属性: **geometry, pos, size, windowOpacity

设置开始值和结束值

setStartValue(self, Any)
setEndValue(self, Any)
setKeyValueAt(self, float, Any)
setKeyValues(self, object)

设置动画时长

  • setDuration(int mesc)

启动动画

  • start()

例子:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
from PyQt5.QtCore import QPropertyAnimation, QPoint, QSize, QRect, QAbstractAnimationclass Window(QWidget):def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)self.setWindowTitle('动画')self.resize(800, 500)self.init_ui()def init_ui(self):self.btn = QPushButton(self)self.btn.resize(50, 20)self.btn.move(0, 0)self.btn.setStyleSheet('QPushButton{border: none; background: red;}')# 添加启动按钮start_button = QPushButton('启动', self)start_button.move(0, 50)start_button.clicked.connect(self.start_animation)# 添加停止按钮stop_button = QPushButton('停止', self)stop_button.move(120, 50)stop_button.clicked.connect(self.stop_animation)# 定义动画对象为成员变量,以便在其他方法中访问self.anima = QPropertyAnimation(self)self.anima.setTargetObject(self.btn)# 对btn的pos属性做动画self.anima.setPropertyName(b'pos')self.anima.setStartValue(QPoint(0, 0))  # 开始位置self.anima.setKeyValueAt(0.5, QPoint(0, 300))  # 在动画时长的中间要插值self.anima.setEndValue(QPoint(self.width(), 0))  # 结束位置self.anima.setDirection(QAbstractAnimation.Backward)   # 动画方向设置# 对btn的size属性做动画# self.anima = QPropertyAnimation(self.btn, b"size", self)# self.anima.setStartValue(QSize(0, 0))# self.anima.setEndValue(QSize(self.width(), self.height()))# 对btn的位置和大小属性做动画# self.anima = QPropertyAnimation(self.btn, b"geometry", self)# self.anima.setStartValue(QRect(0, 0, 100, 100))# self.anima.setEndValue(QRect(200, 200, 300, 300))# 对btn的透明度属性做动画# self.anima = QPropertyAnimation(self.btn, b"windowOpacity", self)# self.anima.setStartValue(1)# self.anima.setKeyValueAt(0.5, 0.5)  # 在动画时长的中间要变为 0.5# self.anima.setEndValue(1)self.anima.setDuration(3000)def start_animation(self):# 设置循环计数为-1,表示无限循环self.anima.setLoopCount(-1)self.anima.start()def stop_animation(self):# 停止动画self.anima.stop()if __name__ == "__main__":app = QApplication(sys.argv)window = Window()window.show()sys.exit(app.exec_())

http://www.mrgr.cn/p/87217007

相关文章

Jetpack Compose 中如何实现全面屏

看问题本质,设置全面屏,是系统窗口的行为,与 View 和 Compose 有什么关系呢? 所以,原理和传统 View 视图是一样的,甚至 Api 都是一模一样的,不熟悉的可以看我之前的文章。传送门: Android 全面屏体验 那为什么还要写这篇文章呢?主要是在 Compose 中写法上的一些区别,…

论文解读:Label Hallucination for Few-Shot Classification

文章汇总 动机 本文的一个思想就是:尽管新类的标签并不能“恰如其分”地表示基数据集中的样本,但是很多基数据集的样本会包含与新类中相似的对象,例如,基数据集中的老虎和新类中的猫有相似的特征,那么就有60%的概率将…

【CSS】使用 scroll snap 实现页面的垂直大屏滚动

CSS 属性 scroll-snap-type 设置了在有滚动容器的情形下吸附至吸附点的严格程度。 scroll-snap-type 使用 scroll snap 也可以用于垂直滚动&#xff0c;全屏展示就是一个很好的例子: <main><section class"section section-1"></section><sect…

4.26文件上传学习

文件上传,绕过,验证,检测一、文件上传 概念:(不赘述转web安全文件上传)[[9.6-9.7基础和过滤方式]] 前置知识:(除解析漏洞)后门代码需要以特定格式后缀解析,不能以图片后缀解析; 知识点 1、文件上传-前端验证 直接修改前端js代码,文件上传格式; 2、黑白名单 3、use…

MySQL—MySQL的存储引擎之InnoDB

MySQL—MySQL的存储引擎之InnoDB 存储引擎及种类 存储引擎说明MyISAM高速引擎&#xff0c;拥有较高的插入&#xff0c;查询速度&#xff0c;但不支持事务InnoDB5.5版本后MySQL的默认数据库存储引擎&#xff0c;支持事务和行级锁&#xff0c;比MyISAM处理速度稍慢ISAMMyISAM的…

Python-Flask-migrate安装和使用

在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库。最直接的方式就是删除旧表,但这样会丢失数据。 更好的解决办法是使用数据库迁移框架,它可以追踪数据库模式的变化,然后把变动应用到数据库中。在Flask中可以使用Flask-Migrate扩展,来实现数据迁移。 环境…

MySQL-07.InnoDB数据存储结构

C-07.InnoDB数据存储结构 1.数据库的存储结构:页索引结构给我们提供了高效的索引方式,不过索引信息以及数据记录都是保存在文件上的,确切说是存储在页结构中。另一方面,索引是在存储引擎中实现的,MySQL服务器上的存储引擎负责对表中数据的读取和写入工作。不同存储引擎中存…

C++感受6-Hello World 交互版

变量、常量输入、输出、流getline() 函数读入整行输入Hello() 函数复习新定义函数 Input() 实现友好的人机交互还有 “痘痘” 为什么挤不到的分析…… 1. DRY 原则简介 上一节课&#xff0c;我们写了两版“问候”程序。第一版的最大问题是重复的内容比较多&#xff0c;每一次问…

以链表为基础实现链式队列——————遍历、入队、出队

以链表为基础实现链式队列 ​ 如果打算以链表作为基础来实现队列的操作,可以避免内存浪费以及避免内存成片移动,只需要确定队头和队尾即可,一般把链表头部作为队头,可以实现头删,把链表尾部作为队尾,可以实现尾插。​ 需要注意的点:遍历队列需要备份地址 出队需要考虑空…

Windows设置开机自启动项

一、常见软件的开机自启设置大部分安装的软件,在设置中都带有“设置开机自启”的选项,直接在软件本身的设置中勾选相应开关项即可。 二、本身无开机自启的软件或一些绿色便携式的软件 (一)实现原理Windows自带了一个启动文件夹,在此文件夹中的软件都会在开机后进行启动操作…

个人音乐播放网站项目(SpringBoot+Linux部署上线)

在做完第一个博客系统项目以后&#xff0c;接着做下一个项目&#xff1a;音乐播放网站项目&#xff0c;此项目应用的技术栈和第一个项目是差不多的&#xff0c;即算是学完SSM等知识以后的两个入门级Java开发项目吧。 此项目包含的核心功能有&#xff1a; 一、登录、注册、退出…

李彦宏:程序员将不复存在! 周鸿祎回怼!网友:先把百度程序员都开除了!

近日&#xff0c;百度创始人、董事长兼首席执行官李彦宏在央视《对话》•开年说的访谈中指出&#xff1a;“基本上说以后其实不会存在“程序员”这种职业了&#xff0c;因为只要会说话&#xff0c;人人都会具备程序员的能力”。 “未来的编程语言只会剩下两种&#xff0c;一种…

Unsortbin attack原理及分析

Unsortbin attack原理 ✔️条件:首先要实现Unsortbin attack前提是可以控制Unsortbin attack chunk的bk指针 ✔️目的:我们可以实现修改任意地址为一个比较大的值 ✔️原理:1.Unsortbin的来源 1.当一个较大的 chunk 被分割成两半后,如果剩下的部分大于MINSIZE,就会被放到 …

flutter release 报错 Error: SocketException: Failed host lookup:

flutter 的 debug 模式没有任何问题 &#xff0c;打了release 包后一直报下面的错&#xff0c;查了一下是 因为没有网络权限 Error: SocketException: Failed host lookup: yomi-test-aws-sg.yomigame.games (OS Error: No address associated with hostname, errno 7) 按照下…

新手Pytorch入门笔记-transforms.Compose()

我使用的图片是上图&#xff0c;直接下载即可 transforms.Compose 是PyTorch中的一个实用工具&#xff0c;用于创建一个包含多个数据变换操作的变换对象。这些变换操作通常用于数据预处理&#xff0c;例如图像数据的缩放、裁剪、旋转等。使用transforms.Compose 可以将多个数据…

ClickHouse 高可用之副本

文章目录 ClickHouse 副本支持副本的引擎配置高可用副本副本应用1.副本表概述2.创建副本表3.写入模拟数据4.副本验证 扩展 —— 在 Zookeeper 中查看副本表信息 ClickHouse 副本 ClickHouse 通过副本机制&#xff0c;可以将数据拷贝存储在不同的节点上。这样&#xff0c;如果一…

运行django

确保app被注册 urls.py中编写url 视图对应关系 命令行启动 python manage.py runserver

iOS - 多线程-GCD-队列组

文章目录 iOS - 多线程-GCD-队列组1. 队列组1.1 基本使用步骤 iOS - 多线程-GCD-队列组 开发过程中&#xff0c;有时候想实现这样的效果 多个任务并发执行所有任务执行完成后&#xff0c;进行下一步处理&#xff08;比如回到主线程刷新UI&#xff09; 1. 队列组 可以使用GC…

npm run dev, serve和build的区别

真实命令分别为npm run vite,npm run vite build,npm run vite preview ctrl+c结束运行的npm项目

算法06链表

算法06链表 一、链表概述1.1概述1.2链表的组成部分&#xff1a;1.3链表的优缺点&#xff1a; 二、链表典例力扣707.设计链表难点分析&#xff1a;&#xff08;1&#xff09;MyLinkedList成员变量的确定&#xff1a;&#xff08;2&#xff09;初始化自定义链表&#xff1a;&…