pyqt 学习基础6 animation皮毛学习

animation皮毛学习

说明

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

概述(扯淡)

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

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

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

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

<!-- lang: python -->
# -*- coding:utf8 -*- 
from PyQt4 import QtCore
from PyQt4 import QtGui
from PyQt4.QtGui import *
from PyQt4.QtCore import *

import sys

app = 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之间的插值速度,如果你想在没有改变插值路径的情况下改变动画速度,那么缓和曲线是很有用的。(把第二个注释去掉)

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

<!-- lang: python -->
# -*- coding:utf8 -*- 
from PyQt4 import QtCore
from PyQt4 import QtGui
from PyQt4.QtGui import *
from PyQt4.QtCore import *

import sys

app = 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值