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

一、继承关系

在这里插入图片描述
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.mzph.cn/web/3451.shtml

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

相关文章

Wi-Fi HaLow:重塑物联网的未来

Wi-Fi HaLow:引领物联网连接的革命 数字时代的蓬勃发展正在引发一场深刻的变革,物联网已经融入到我们的日常生活和工作中,成为不可或缺的一部分。随着新一代Wi-Fi技术一Wi-Fi HaLow的崭露头角,有望在2024年及未来,重新…

Mybatis 动态Sql标签使用总结

一、前言 常用的动态sql标签包括 if、choose(when、otherwise)、trim(where、set)、foreach。 二、标签介绍 2.1、if 标签 1、动态拼接查询条件 select DISTINCT ksid as id,ksdm as cd , ksmc as na ,id_org ,1 as fg_active,kspydm as py FROMV_CIS_RO_USERWHERE 11<…

数据结构 - 链表详解(二)—— 带头双向循环链表

链表的介绍 链表的结构一共有八种&#xff1a;带头单向循环链表、带头单向非循环链表、带头双向循环链表、带头双向非循环链表、无头单向循环链表、无头单向非循环链表、无头双向循环链表、无头双向非循环链表。 今天我们来详解带头双向循环链表 带头双向循环链表是一种数据结…

Flutter开发好用插件url_launcher详解-启动 URL

文章目录 url_launcher介绍安装用法错误处理自定义行为其他功能 url_launcher介绍 url_launcher 是一个 Flutter 插件&#xff0c;用于启动 URL。它支持网络、电话、短信和电子邮件方案。您可以使用它从您的 Flutter 应用程序中打开网站、拨打号码、发送短信或撰写电子邮件。 …

javaSE (七):异常

目录 一、Java 异常概述 1.异常概念 2.异常的抛出机制 3.如何对待异常 二、 java异常体系结构 1.Throwable 2. Throwable分类 三、常见的异常 1.Error 2.异常--运行时异常 四、异常处理 1.try 2.catch 3.finally 4.throws 5.throw 五、运行期异常和编译期异常…

commvault学习(6):备份oracle(包括oracle的安装)

1.环境 CS、MA&#xff1a;一台windows server2012 客户端&#xff1a;2台安装了oracle11g的windows server2008 1.1 windows server2008安装oracle11g &#xff08;1&#xff09;右击安装包内的setup&#xff0c;以管理员方式运行 &#xff08;2&#xff09;取消勾选接收安…

仿真-Carla初识-安装

仿真方面研究,希望掌握仿真技术 目录 前言1. Carla基本架构2.Carla安装2.1 Pre-comiled版本2.1.1 安装要求2.1.2 安装前言 学习参考文档: 1.小飞自动驾驶系列分享 1. Carla基本架构 Client-Server的交互形式:Carla主要分为Server与Client两个模块,Server端用来建立这个仿…

echarts柱形图实现2.5D

思路&#xff1a;使用markpoint option {title: {text: Rainfall vs Evaporation,subtext: Fake Data},tooltip: {trigger: axis},legend: {data: [Rainfall, Evaporation]},toolbox: {show: true,feature: {dataView: { show: true, readOnly: false },magicType: { show: t…

51单片机入门_江协科技_27~28_OB记录的自学笔记_AT24C02数据存储秒表

27. AT24C02(I2C总线) 27.1. 存储器介绍 27.2. 存储器简化模型介绍&#xff0c;存储原理 27.3. AT24C02介绍 •AT24C02是一种可以实现掉电不丢失的存储器&#xff0c;可用于保存单片机运行时想要永久保存的数据信息 •存储介质&#xff1a;E2PROM •通讯接口&#xff1a;I2…

Python基础:【习题系列】判断题(三)

在Python中&#xff0c;列表推导可以用来创建新的列表。 答案&#xff1a;对 Python中使用!操作符来检查两个值是否不相等。 答案&#xff1a;对 Python中的类定义中必须包含至少一个方法。 答案&#xff1a;错 nonlocal关键字用于在函数或其他作用域内访问外部&#xff08;…

【JS基础】1.函数、匿名函数、回调函数、IIFE(立即执行函数)

【JS基础】1.函数、匿名函数、回调函数、IIFE(立即执行函数) 1. 认识函数 函数到底是什么&#xff1f; 函数其实就是某段代码的封装&#xff0c;这段代码帮助我们完成某一下功能JS引擎中有一些已经提供的函数我们也可以编写属于自己的函数 函数使用的步骤 声明函数&#xff1…

十大经典排序算法之插入排序。

插入排序 (Insertion Sort) ​ 插入排序&#xff08;Insertion Sort&#xff09;是一种简单直观的排序算法&#xff0c;它的基本思想是逐步构建最终的排序列表&#xff0c;每次将一个未排序的元素插入到已排序的部分的适当位置。 插入排序的基本步骤如下&#xff1a; 首先&a…

第十五届蓝桥杯省赛第二场C/C++B组E题【遗迹】题解

解题思路 错解 贪心&#xff1a;每次都移动至当前最近的对应方块上。 反例&#xff1a; s s s abxac t t t abac 贪心结果&#xff08;下标&#xff09; 0 → 1 → 0 → 4 0 \rightarrow 1 \rightarrow 0 \rightarrow 4 0→1→0→4&#xff0c;答案为 5 5 5。 正确结…

仿真-Carla初识-运行

目录 0.简介1.导入地图AdditionalMaps2.Carla运行 0.简介 carla-github下载 python是通过ip127.0.0.1&#xff0c;port 2000与Carla进行本地通讯的&#xff08;脚本与CarlaUE4.exe在同一台电脑&#xff09;&#xff0c;下面可能是大家可能会遇到的问题&#xff1b; 代码中端口…

VMware配置centos虚拟机实现内网互通

VMware配置centos虚拟机实现内网互通 一、安装无桌面模式 环境说明&#xff1a; VMWare版本&#xff1a;VMware Workstation 17 Pro Centos版本&#xff1a;CentOS-7.9-x86_64-DVD-2009.iso 一键下载本文资源包 1. 安装虚拟机 下面是创建具体步骤,其中需要注意的是&#xff1…

说说2024年暑期三下乡社会实践工作新闻投稿经验

作为一名在校大学生,我有幸自去年起参与学院组织的暑期大学生三下乡社会实践团活动。这项活动不仅是我们深入基层、服务社会的重要平台,也是展现当代大学生风采、传递青春正能量的有效途径。然而,如何将这些生动鲜活的实践故事、感人至深的瞬间传播出去,让更多人了解并受到启发…

LeetCode54. 螺旋矩阵

LeetCode54.螺旋矩阵 题解思路 代码 class Solution { public:vector<int> spiralOrder(vector<vector<int>>& matrix) {vector<int> res;int n matrix.size();// 行int m matrix[0].size(); // 列vector<vector<bool>> st(n, v…

懂技术不代表懂互联网

作为一个技术开发者&#xff0c;也就是程序员&#xff0c;个人一直认为自己是一个互联网从业者&#xff0c;也认为自己懂互联网。但是&#xff0c;直到今天突然才发现&#xff0c;自己根本不懂互联网&#xff0c;自己认为的懂互联网只是从技术人员的角度理解互联网&#xff0c;…

【JAVA】PO、VO、DAO、BO、DTO、POJO你分得清吗?

在Java开发中&#xff0c;PO、VO、DAO、BO、DTO、POJO这些词汇是比较常见的&#xff0c;每个术语都有其特定的含义和用途。下面是它们的具体区别&#xff1a; 名称简要概况用途和特定PO (Persistence Object) 持…

2024.4.25力扣每日一题——总行驶距离

2024.4.25 题目来源我的题解方法一 模拟 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2739 我的题解 方法一 模拟 当mainTank还剩5升及以上的油&#xff0c;直接一次性减5升&#xff0c;距离加50&#xff0c;然后看additionalTank是否还有油&#xff0c;若有减1&…