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.Running

def 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, QAbstractAnimation


class 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.mfbz.cn/a/575045.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud之负载均衡Ribbon

Ribbon 是一个客户端负载均衡工具,主要功能是将面向服务的Rest模板(RestTemplate)请求转换成客户端负载均衡的服务调用。通过Ribbon,开发人员可以在客户端实现请求的负载均衡,而无需单独部署负载均衡器。Ribbon支持多…

C#基础之值类型和引用类型

值类型和引用类型 文章目录 值类型和引用类型1、使用和存储上的区别2、特殊的引用类型string 引用类型:string,数组,类 值类型:其他类型,结构体 1、使用和存储上的区别 1、使用上的区别//值类型int a 10;//引用类型…

Python函数小知识

目录 一、函数的定义和调用 二、函数参数 三、函数作用域 四、递归函数和匿名函数 一、函数的定义和调用 def 函数名(参数): 自定义函数可以分为有参函数和无参函数 。 函数的作用: 在Python中定义函数可以提高代码的复用率,避免重复的代码,…

Android 记录一个SeekBar的滑块显示问题

这两天,要实现一个自定义的进度条SeekBar,从UI那里拿到切图之后,就开始做了,但是最后发现一个问题,看一下图吧: 应该看的很清楚吧,那个滑块周围多了一些“阴影” 我刚开始以为是切图又问题&…

opencv基础篇 ——(七)边缘检测和图像锐化

锐化和边缘检测是图像处理中常用的两种技术,它们可以用来增强图像的特征以及检测图像中的边缘 锐化: 锐化是一种增强图像中细节和边缘的技术,它使图像中的过渡区域更加明显,从而提高图像的清晰度和对比度。常见的锐化方法包括拉普…

matlab保存示波器数据

再重新运行一下示波器 然后就可以在工作区看见(这里没有运行所以没有) 将保存到文件夹中方便后续绘图

第十五届蓝桥杯省赛第二场C/C++B组D题【前缀总分】题解(AC)

暴力解法 O ( 26 n 5 ) O(26n^5) O(26n5) 枚举将第 i i i 个字符串的第 j j j 个字符改为 c c c 的所有方案,时间复杂度 O ( 26 n 2 ) O(26n^2) O(26n2),修改并计算总分, O ( n 3 ) O(n^3) O(n3)。 暴力优化 O ( 26 n 3 log ⁡ n ) O…

解析企业绩效通系统架构:构建高效管理与激励平台

在当今竞争激烈的商业环境中,企业需要不断提升管理效率和员工激励力度,以保持竞争优势并实现可持续发展。绩效通系统作为一种集成了绩效管理、激励机制和员工发展规划的管理工具,正逐渐成为现代企业管理的核心组成部分。本文将深入探讨企业绩…

mybatis-plus(二)集成与demo

一、集成 1、pom&#xff1a; 2、配置文件 3、启动类与业务逻辑&#xff1a; 无变化。引入mybatis-plus后&#xff0c;原mybatis逻辑可以正常使用。 二、demo 1、代码框架 &#xff08;1&#xff09;pom&#xff1a; <?xml version"1.0" encoding"UT…

Python实现本地视频/音频播放器

Python实现本地视频/音频播放器 在Python中&#xff0c;有几个库可以用于视频播放&#xff0c;但是没有一个库是完美的&#xff0c;因为它们可能依赖于外部软件或有一些限制。 先看介绍用Python实现本地视频播放器&#xff0c;再介绍用Python实现本地音乐播放器。 Python实现…

CSS Position定位(详解网页中的定位属性)

目录 一、Position介绍 1.概念 2.特点 3.作用 4.应用 二、Position用法 1.position属性 2.static定位 3.fixed定位 4.relative定位 5.absolute定位 6.sticky定位 7.重叠的元素 三、CSS定位属性 四、总结 一、Position介绍 1.概念 文档流&#xff08;Document Fl…

【从后端日志文件中过滤出sql语句】

从后端日志文件中过滤出sql语句 why?思路日志文件的格式 结果 why? 为什么会有这种需求&#xff1f;&#xff0c;mysql数据不小心被删了完全可以从备份数据恢复&#xff0c;或者从binlog中恢复&#xff0c;但是如果前面这两种方法没办法处理&#xff08;没有备份数据库文件、…

ray.tune调参学习笔记1:超参数优化器tuner设置

最近研究中学习使用python的ray.tune进行神经网络调参。在这里记录学习过程中的收获&#xff0c;希望能够帮助到有同样需求的人。学习过程主要参考ray官网文档&#xff0c;但由于笔者使用的ray为2.2.0版本&#xff0c;而官方文档为更高级版本&#xff0c;笔者代码和官方文档代码…

数字藏品:重塑艺术与科技的新媒介

数字藏品&#xff0c;这个新兴的词汇&#xff0c;正在逐渐渗透到我们的日常生活中。它不仅是一种新的艺术表达方式&#xff0c;更是一种科技与艺术相结合的全新媒介。那么&#xff0c;数字藏品究竟是什么呢&#xff1f; 首先&#xff0c;我们需要明确一点&#xff0c;数字藏品并…

qt QTreeWidget 学习

树形控件的节点可以有多层、多个子节点&#xff0c; 如果将子节点全部展开&#xff0c;那么每一行都是一个数据条目。QTreeWidgetItem 比较特殊&#xff0c;一个条目内部可以有多列数据信息&#xff0c;相当于表格控件一整行的表格单元集成为一个条目。 默认情况下&#xff0c;…

ELK技术介绍:背景、功能及应用场景全面解析

一、ELK概述 ELK是由Elasticsearch、Logstash和Kibana三个开源软件组成的日志管理解决方案&#xff0c;这一组合在近年来得到了广泛的关注和应用。ELK的出现&#xff0c;源于大数据和云计算技术的快速发展&#xff0c;以及对高效日志管理的迫切需求。 随着企业信息化程度…

Nginx 配置 SSL(HTTPS)详解

Nginx作为一款高性能的HTTP和反向代理服务器&#xff0c;自然支持SSL/TLS加密通信。本文将详细介绍如何在Nginx中配置SSL&#xff0c;实现HTTPS的访问。 随着互联网安全性的日益重要&#xff0c;HTTPS协议逐渐成为网站加密通信的标配。Nginx作为一款高性能的HTTP和反向代理服务…

6、ES单机设置用户名密码、集群设置用户名密码、es-head登录、如何去掉密码

目录 一、ES单节点密码配置1、修改配置文件2、 重启es服务3&#xff0c;执行修改密码命令4、访问服务 二、ES集群密码配置1、确定主节点2、生成elastic-stack-ca.p123、生成elastic-certificates.p124、修改配置文件并重启集群5、进行密码配置6、验证 三、es-head登录增加密码的…

ABAP json解析使用引用代替预定义数据结构

背景&#xff1a;在解析JSON数据时&#xff0c;通常会事先为定义相应的ABAP数据结构。但是&#xff0c;当遇到一些结构纵深较为复杂的情况时&#xff0c;会比较麻烦。 处理&#xff1a;使用引用类型来定义结构中的纵深部分来达到“省事”的目的&#xff0c;缺点在于访问时需要使…

Docker——开源的应用容器的引擎

目录 一、前言 1.虚拟化产品有哪些 1.1寄居架构 1.2源生架构 2.虚拟化产品对比/介绍 2.1虚拟化产品 2.1.1仿真虚拟化 2.1.2半虚拟化 2.1.3全虚拟化 2.2重点 2.2.1KVM——Linux内核来完成的功能和性能 2.2.2ESXI——用的比较多 二、Docker概述 1.Docker定义 2.Do…