博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
pyqt 学习基础6 animation皮毛学习
阅读量:6040 次
发布时间:2019-06-20

本文共 3657 字,大约阅读时间需要 12 分钟。

hot3.png

animation皮毛学习

说明

  • 学习资源:
  • 我就差不多是把他们的东西加个包装盒,然后一个一个的搬运过来,这个包装盒我(会)尽(把)量(人)搞(弄)好(糊)一(涂)点(的)。
  • 因为不是什么没有很系统的学习,所以这里的笔记着重应用方面,一些概念就可能不是很清楚,要在实践过程中慢慢领悟

概述(扯淡)

Qt动画框架既是独立的一部分,也是Qt状态机框架的一部分。Qt状态机框架提供一个状态用来行使动画。当QState进入或者退出时可以改变属性,当这个动画状态提供了一个QPropertyAnimatio时,则动画状态即在这些值之间进行插值衍化操作。(注意到几个关键词,感觉在程序中会经常碰到)

下面是Qt动画框架类(常见的)(通俗的讲就是做简单和复杂动画的基础)

  • QAbstractAnimation : 所有动画类的基类
  • QAnimationGroup : 动画容器类的抽象基类
  • QEasingCurve : 动画控制的缓和曲线类
  • QParallelAnimationGroup : 并行动画容器
  • QPauseAnimation : QSequentialAnimationGroup对象暂停延迟
  • QSequentialAnimationGroup : 串行动画容器
  • QTimeLine : 动画控制的时间片类
  • QVariantAnimation : 动画类的抽象基类
  • QPropertyAnimation : Qt动画属性操作 (常见)

举个小栗子(动画中的hello world)

# -*- coding:utf8 -*- from PyQt4 import QtCorefrom PyQt4 import QtGuifrom PyQt4.QtGui import *from PyQt4.QtCore import *import sysapp = QApplication(sys.argv)window = QMainWindow()window.show()animation = QPropertyAnimation(window, "geometry")animation.setDuration(10000)animation.setStartValue(QRect(0, 0, 100, 30))#animation.setKeyValueAt(0.5, QRect(240, 240, 100, 30));animation.setEndValue(QRect(250, 250, 100, 30))# animation.setEasingCurve(QEasingCurve.OutBounce)animation.start()app.exec_()
  • 10秒的时间内,把window从屏幕的左上角移动到(250,250)点处
  • 上述代码在开始值与结束值之间做了线性插值。当然,在开始处与结束处之间插入数值也可以(把第一个注释去掉)。
  • QPropertyAnimation在开始与结束之间执行插值操作。除了对动画操作设置更多关键值之外,你也可以使用缓和曲线,缓和曲线控制着在0与1之间的插值速度,如果你想在没有改变插值路径的情况下改变动画速度,那么缓和曲线是很有用的。(把第二个注释去掉)

再举个小例子(动画分组)

# -*- coding:utf8 -*- from PyQt4 import QtCorefrom PyQt4 import QtGuifrom PyQt4.QtGui import *from PyQt4.QtCore import *import sysapp = QApplication(sys.argv)window = QMainWindow()window.show()window2 = QMainWindow()window2.show()animation = QPropertyAnimation(window, "geometry")animation2 = QPropertyAnimation(window2, "geometry")group = QParallelAnimationGroup()animation.setDuration(10000)animation.setStartValue(QRect(0, 0, 100, 30))animation.setEndValue(QRect(250, 250, 100, 30))animation.setEasingCurve(QEasingCurve.OutBounce)animation2.setDuration(10000)animation2.setStartValue(QRect(250, 150, 100, 30))animation2.setEndValue(QRect(850, 250, 100, 30))animation2.setEasingCurve(QEasingCurve.CosineCurve)group.addAnimation(animation)group.addAnimation(animation2)group.start()app.exec_()
  • 一个应用程序常常包含不止一个动画。例如,你或许希望同时移动不止一个图形项或者一个接着一个的顺序移动它们。
  • QAnimationGroup (QSequentialAnimationGroup和QParallelAnimationGroup)的子类是动画容器类,因此多个动画可以被串行或者并行。QAnimationGroup类就是一个例子,其不操作动画属性,但是它能周期性的获得定时通知,这使得它能把定时通知应用于动画中,从而进行控制。

动画和状态

  • 当使用Qt状态机时,我们可以使用QSignalTransition或QEventTransition类将一个或者多个动画与状态之间的切换中进行关联。这些类继承于QAbstractTransition,QAbstractTransition类提供了方便的函数addAnimation(),该函数在状态切换发生的情况下能触发一个或多个被附加的动画。

  • 我们也可以和状态进行属性关联,而不是自己设置开始和结束值,下面就是一段完整的动画操作QPushButton位置的代码例子

    <!-- lang: python -->

    from PyQt4 import QtCore      from PyQt4 import QtGui      from PyQt4.QtGui import *      from PyQt4.QtCore import *      import sys      app = QApplication(sys.argv)      button = QPushButton()      button.show()      machine = QStateMachine()      stateone = QState(machine)      stateone.assignProperty(button, "geometry", QRect(100, 100, 100, 60))      machine.setInitialState(stateone)      statetwo = QState(machine)      statetwo.assignProperty(button, "geometry", QRect(250, 250, 100, 60))      transition1 = QSignalTransition()      transition1 = stateone.addTransition(button, SIGNAL("clicked()"), statetwo)      a1 = QPropertyAnimation(button, "geometry")      transition1.addAnimation(a1)      transition2 = QSignalTransition()      transition2 = statetwo.addTransition(button, SIGNAL("clicked()"), stateone)      a2 = QPropertyAnimation(button, "geometry")      transition2.addAnimation(a2)      machine.start()      app.exec_()
  • 点击按钮,改变状态机,从而触发动画

转载于:https://my.oschina.net/zjuysw/blog/308823

你可能感兴趣的文章
JDK(java se development kit)的构成
查看>>
数据库的备份与恢复
查看>>
Android示例程序剖析之记事本(一)
查看>>
为什么英雄难过美人关?
查看>>
poj 3009 Curling 2.0
查看>>
Tomcat7安装配置 for Ubuntu
查看>>
Linux:命令执行控制&&与||
查看>>
麻球繁衍
查看>>
FreeRTOS栈溢出检查
查看>>
linux下,远程连接mysql
查看>>
浅谈js闭包(closure)
查看>>
【regex】POSIX标准正则表达式库
查看>>
C#集成FastReport.Net并将模板保存到数据库
查看>>
python装饰器(decorator)两种模式探讨集合
查看>>
高级 DO 语法
查看>>
Jexus下配置多个站点
查看>>
Xcode编辑器的技巧与诀窍
查看>>
String、StringBuffer与StringBuilder之间区别
查看>>
工作第十三周:身体掏空,精神饱满
查看>>
Linux 内核--任务0的运行(切换到用户模式)move_to_user_mode
查看>>