当前位置: 首页 > news >正文

PySide(PyQt)的QPropertyAnimation(属性动画)的应用实践

关于QPropertyAnimation的基础知识见PySide(PyQt)的QPropertyAnimation(属性动画)-CSDN博客

原理和语句都很简单。然而在实践使用中 ,还是踩了坑,耗了一下午的时间才解决。

看代码:

from PyQt5.QtCore import QPropertyAnimation, QSize, QEasingCurve
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget, QLabelapp = QApplication([])# 创建一个窗口
window = QWidget()
window.setGeometry(100, 100, 800, 300)
layout = QVBoxLayout(window)# 创建一个标签
label = QLabel("Animate Me")
label.setStyleSheet('border:2px solid #b6b6b6;background-color:#e0e0e0;')
label.setFixedHeight(40)  # 固定按钮的高度
layout.addWidget(label)# 创建 QPropertyAnimation 对象
animation = QPropertyAnimation(label, b"size")# 设置动画的起始值和结束值
start_size = label.size()
end_size = QSize(300, label.height())  # 目标宽度为300,高度保持不变
animation.setStartValue(start_size)
animation.setEndValue(end_size)# 设置动画持续时间(2000 毫秒即 2 秒)
animation.setDuration(2000)# 设置缓动曲线为线性
animation.setEasingCurve(QEasingCurve.Linear)# 启动动画
animation.start()window.show()
app.exec_()

这个代码的运行是没有任何问题的。将其稍加修改:

from PyQt5.QtCore import QPropertyAnimation, QSize, QEasingCurve
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget, QLabelapp = QApplication([])# 创建一个窗口
window = QWidget()
window.setGeometry(100, 100, 800, 300)
layout = QVBoxLayout(window)# 创建一个标签
label = QLabel("Animate Me")
label.setStyleSheet('border:2px solid #b6b6b6;background-color:#e0e0e0;')
label.setFixedHeight(40)  # 固定按钮的高度
layout.addWidget(label)def animate():# 创建 QPropertyAnimation 对象animation = QPropertyAnimation(label, b"size")# 设置动画的起始值和结束值start_size = label.size()end_size = QSize(300, label.height())  # 目标宽度为300,高度保持不变animation.setStartValue(start_size)animation.setEndValue(end_size)# 设置动画持续时间(2000 毫秒即 2 秒)animation.setDuration(2000)# 设置缓动曲线为线性animation.setEasingCurve(QEasingCurve.Linear)# 启动动画animation.start()animate()
window.show()
app.exec_()

        新的代码中,将动画部分的定义和设置、运行定义为一个函数animate(),并在主循环中运行。从逻辑和语法上看没有任何问题,但是,运行的结果,并没有执行预期的动画。

        究其原因, 新的代码中,QPropertyAnimation 对象animation,它是函数animate()的一个局部变量,当函数animate()执行完毕后,并没有将该变量传递到主线程,所以造成运行异常。解决方法是将QPropertyAnimation 对象定义为一个全局变量,即可保证在局部函数运行后,QPropertyAnimation 对象仍然持续运行。修改后的代码:

from PyQt5.QtCore import QPropertyAnimation, QSize, QEasingCurve
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget, QLabelapp = QApplication([])# 创建一个窗口
window = QWidget()
window.setGeometry(100, 100, 800, 300)
layout = QVBoxLayout(window)# 创建一个标签
label = QLabel("Animate Me")
label.setStyleSheet('border:2px solid #b6b6b6;background-color:#e0e0e0;')
label.setFixedHeight(40)  # 固定按钮的高度
layout.addWidget(label)# 创建全局变量的QPropertyAnimation 对象
animation = QPropertyAnimation(label, b"size")def animate():# 创建 QPropertyAnimation 对象# animation = QPropertyAnimation(label, b"size")# 设置动画的起始值和结束值start_size = label.size()end_size = QSize(300, label.height())  # 目标宽度为300,高度保持不变animation.setStartValue(start_size)animation.setEndValue(end_size)# 设置动画持续时间(2000 毫秒即 2 秒)animation.setDuration(2000)# 设置缓动曲线为线性animation.setEasingCurve(QEasingCurve.Linear)# 启动动画animation.start()animate()
window.show()
app.exec_()

或者:

from PyQt5.QtCore import QPropertyAnimation, QSize, QEasingCurve, QObject
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget, QLabelapp = QApplication([])# 项目的定义
class UI(QObject):  # 将项目定义为QObject,用来管理项目级别的信号和变量def __init__(self):super().__init__()# 窗口的定义
class Window(QWidget):def __init__(self, parent=None):super().__init__(parent)self.setupUI()def setupUI(self):self.setGeometry(100, 100, 800, 300)self.layout = QVBoxLayout(self)# 创建一个标签self.label = QLabel("Animate Me")self.label.setStyleSheet('border:2px solid #b6b6b6;background-color:#e0e0e0;')self.label.setFixedHeight(40)  # 固定按钮的高度self.layout.addWidget(self.label)# UI类的实体化
ui = UI()
# 窗口的实体化
window = Window()# 创建全局变量的QPropertyAnimation 对象
ui.animation = QPropertyAnimation(window.label, b"size")def animate(obj):# 创建 QPropertyAnimation 对象# animation = QPropertyAnimation(label, b"size")# 设置动画的起始值和结束值start_size = obj.size()end_size = QSize(300, obj.height())  # 目标宽度为300,高度保持不变ui.animation.setStartValue(start_size)ui.animation.setEndValue(end_size)# 设置动画持续时间(2000 毫秒即 2 秒)ui.animation.setDuration(2000)# 设置缓动曲线为线性ui.animation.setEasingCurve(QEasingCurve.Linear)# 启动动画ui.animation.start()animate(window.label)
window.show()
app.exec_()

 这个代码中,定义了一个UI(QObject)的类,将其作为项目级别的信号和变量的容器。以“ui.”开头的变量都是项目级别的、跨画面的,其生命周期属于主线程。

进一步的应用demo,见PySide(PyQt)使用QPropertyAnimation制作动态界面-CSDN博客

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • vue elementui 在table里使用el-switch
  • 经典文献阅读之--LIV-GaussMap(实时3D辐射场地图渲染的LiDAR惯性视觉融合算法)
  • tmux相关命令
  • 2024年7月25日(Git gitlab以及分支管理 )
  • linux禁用root
  • C++中的依赖注入
  • 手机怎么设置不同的ip地址
  • PHP Filesystem 简介
  • 【WAF剖析】10种XSS某狗waf绕过姿势,以及思路分析
  • 探索PyMuPDF:Python中的强大PDF处理库
  • 单例模式_Golang
  • 可以免费合并pdf的软件 合并pdf文件的软件免费 合并pdf的软件免费
  • 二十、【机器学习】【非监督学习】- 均值漂移 (Mean Shift)
  • {Spring Boot 原理篇} Spring Boot自动装配原理
  • Tracy 小笔记:微信小程序 mpx 雷达图的实现
  • hexo+github搭建个人博客
  • 0基础学习移动端适配
  • Android系统模拟器绘制实现概述
  • Asm.js的简单介绍
  • es6--symbol
  • Java方法详解
  • js ES6 求数组的交集,并集,还有差集
  • Nacos系列:Nacos的Java SDK使用
  • oschina
  • react 代码优化(一) ——事件处理
  • webpack入门学习手记(二)
  • WePY 在小程序性能调优上做出的探究
  • WinRAR存在严重的安全漏洞影响5亿用户
  • Zsh 开发指南(第十四篇 文件读写)
  • 半理解系列--Promise的进化史
  • 分享一份非常强势的Android面试题
  • - 概述 - 《设计模式(极简c++版)》
  • 如何实现 font-size 的响应式
  • 无服务器化是企业 IT 架构的未来吗?
  • 新版博客前端前瞻
  • 用Visual Studio开发以太坊智能合约
  • 由插件封装引出的一丢丢思考
  • 责任链模式的两种实现
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • ​520就是要宠粉,你的心头书我买单
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ## 基础知识
  • #include到底该写在哪
  • (13):Silverlight 2 数据与通信之WebRequest
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (bean配置类的注解开发)学习Spring的第十三天
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第1节 (全局数据、栈和堆)
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (二)fiber的基本认识
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)