Qt動畫框架既是獨立的一部分,也是Qt狀態機框架的一部分。
Qt狀態機
框架提供一個狀態用來行使動畫。當QState
進入或者退出時能夠改變屬性,當這個動畫狀態提供了一個QPropertyAnimatio
時,則動畫狀態即在這些值之間進行插值衍化操做。(注意到幾個關鍵詞,感受在程序中會常常碰到)html
下面是Qt動畫框架類(常見的)(通俗的講就是作簡單和複雜動畫的基礎)python
QAbstractAnimation
: 全部動畫類的基類QAnimationGroup
: 動畫容器類的抽象基類QEasingCurve
: 動畫控制的緩和曲線類QParallelAnimationGroup
: 並行動畫容器QPauseAnimation
: QSequentialAnimationGroup對象暫停延遲QSequentialAnimationGroup
: 串行動畫容器QTimeLine
: 動畫控制的時間片類QVariantAnimation
: 動畫類的抽象基類QPropertyAnimation
: Qt動畫屬性操做 (常見)<!-- 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_()
線性插值
。固然,在開始處與結束處之間插入數值也能夠(把第一個註釋去掉)。<!-- 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_()
當使用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_()
點擊按鈕,改變狀態機,從而觸發動畫學習