pyqt 學習基礎6 animation皮毛學習

animation皮毛學習

說明

  • 學習資源:
  • 我就差很少是把他們的東西加個包裝盒,而後一個一個的搬運過來,這個包裝盒我(會)盡(把)量(人)搞(弄)好(糊)一(塗)點(的)。
  • 由於不是什麼沒有很系統的學習,因此這裏的筆記着重應用方面,一些概念就可能不是很清楚,要在實踐過程當中慢慢領悟

概述(扯淡)

Qt動畫框架既是獨立的一部分,也是Qt狀態機框架的一部分。Qt狀態機框架提供一個狀態用來行使動畫。當QState進入或者退出時能夠改變屬性,當這個動畫狀態提供了一個QPropertyAnimatio時,則動畫狀態即在這些值之間進行插值衍化操做。(注意到幾個關鍵詞,感受在程序中會常常碰到)html

下面是Qt動畫框架類(常見的)(通俗的講就是作簡單和複雜動畫的基礎)python

  • 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(),該函數在狀態切換髮生的狀況下能觸發一個或多個被附加的動畫。app

  • 咱們也能夠和狀態進行屬性關聯,而不是本身設置開始和結束值,下面就是一段完整的動畫操做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_()
  • 點擊按鈕,改變狀態機,從而觸發動畫學習

相關文章
相關標籤/搜索