属性动画QPropertyAnimation---QAbstractAnimation基本功能


属性动画QPropertyAnimation

继承于 QAbstractAnimation-->QVariantAnimation-->QPropertyAnimation  

改变大小、颜色或位置是动画中的常见操作,而QPropertyAnimation类可以修改控件的属性值

from PyQt5.QtWidgets import QApplication, QWidget,QPushButton
import sys
from PyQt5.QtCore import QPropertyAnimation,QPoint,QSize,QRect,QEasingCurve

class win(QWidget):
    def __init__(self):
        super().__init__()
        self.resize(400,400)
        self.setWindowTitle('动画学习')

        btn=QPushButton('按钮',self)
        btn.move(100,100)
        btn.resize(100,100)
        btn.setStyleSheet('background-color:yellow')
        #ani=QPropertyAnimation(btn,b'pos',self) #创建动画对象
        ani = QPropertyAnimation(self) #创建动画对象 ani.setTargetObject(btn) #设置动画目标对象
        #ani.setTargetObject(self)
        ani.setPropertyName(b'pos') #设置动画属性
        #注意:字节类型
        #pos---位置动画---QPoint
        #size---大小动画---QSize
        #geometry----位置+大小动画----QRect
        #windowOpacity---窗口的透明度(0.0是透明的    1.0是不透明)---好像只适合顶层窗口
 ani.setStartValue(QPoint(0,0)) #设置开始位置---按钮的左上角位置
        ani.setEndValue(QPoint(300,300)) #设置结束位置
        #ani.setStartValue(QSize(0, 0)) # 设置开始大小
        #ani.setEndValue(QSize(300, 300)) # 设置结束大小
        #ani.setStartValue(QRect(0, 0,100,100)) # 设置开始位置和大小
        #ani.setEndValue(QRect(100,100,300, 300)) # 设置结束位置和大小

        #ani.setStartValue(1) # 设置开始不透明
        #ani.setKeyValueAt(0.5,0.2)#在动画的某时间点插入一个值
        #参数1 0.0到1.0  0.0表示开始点,1.0表示结束点
        #在动画的中间插入透明度0.2
        #ani.setKeyValueAt(1, 1)  #在动画的结束点是不透明的

        #ani.setEndValue(0) # 设置结束透明
        ani.setDuration(5000) #设置动画单次时长---单位毫秒
 ani.setEasingCurve(QEasingCurve.InQuad) #设置动画的节奏
        #取值   https://doc.qt.io/qt-5/qeasingcurve.html#Type-enum
 ani.start() #动画开始---非阻塞

if __name__=='__main__':
    app=QApplication(sys.argv)
    w=win()
    w.show()
    sys.exit(app.exec_())

 

 

属性动画的父类功能 

from PyQt5.QtWidgets import QApplication, QWidget,QPushButton
import sys
from PyQt5.QtCore import QPropertyAnimation,QPoint,QSize,QRect,QEasingCurve,QAbstractAnimation

class win(QWidget):
    def __init__(self):
        super().__init__()
        self.resize(400,400)
        self.setWindowTitle('动画学习')

        btn=QPushButton('按钮',self)
        btn.move(100,100)
        btn.resize(100,100)
        btn.setStyleSheet('background-color:yellow')
        btn.clicked.connect(self.AA)
        btn1 = QPushButton('暂停', self)
        btn1.clicked.connect(self.BB)
        btn1.move(10,150)
        btn2 = QPushButton('恢复暂停', self)
        btn2.clicked.connect(self.CC)
        btn2.move(10, 200)
        btn3 = QPushButton('停止', self)
        btn3.clicked.connect(self.DD)
        btn3.move(10, 250)
        btn4 = QPushButton('设置时间', self)
        btn4.clicked.connect(self.EE)
        btn4.move(10, 300)



        ani = QPropertyAnimation(self)
        self.ani=ani
        ani.setTargetObject(btn)
        ani.setPropertyName(b'pos')
        ani.setStartValue(QPoint(0,0))
        ani.setEndValue(QPoint(300,300))
        ani.setDuration(5000)
        ani.setEasingCurve(QEasingCurve.InQuad)
        ani.setLoopCount(3) #设置动画次数---默认1次
        ani.setDirection(QAbstractAnimation.Forward) #设置动画方向
        #QAbstractAnimation.Backward=1  动画的当前时间随着时间减少(即,从结束/持续时间向0移动)---倒序
        #QAbstractAnimation.Forward=0 动画的当前时间随着时间而增加(即,从0移动到结束/持续时间)---顺序

        #信号
        ani.currentLoopChanged.connect(self.FF) #循环遍数发生变化时
        #会向槽函数传递一个参数---当前循环的遍数

        #directionChanged(QAbstractAnimation.Direction newDirection) 动画方向发生改变时
        #会向槽函数传递一个参数---动画新方向
 ani.finished.connect(self.HH) #动画完成时
 ani.stateChanged.connect(self.GG) #状态发生改变时
        # 会向槽函数传递两个参数---新状态和老状态

        ani.start() #启动动画
        #参数 QAbstractAnimation.KeepWhenStopped 停止时不会删除动画
        # QAbstractAnimation.DeleteWhenStopped 停止时动画将自动删除

    def AA(self):
        s=self.ani.loopCount() #返回动画总循环次数
        print('动画总循环次数',s)
        s = self.ani.currentLoop() # 返回当前是循环中的第几次---0次开始
        #如果setDirection设置为倒序,返回值也是倒序
        print('当前次数是:', s)
        s = self.ani.duration() #返回单次时长
        print('单次时长是:', s)
        s = self.ani.currentLoopTime() # 当前单次循环内的时间
        # 如果setDirection设置为倒序,返回值也是倒序
        print('当前单次循环内的时间是:', s)
        s = self.ani.currentTime() #当前总循环中时长
        #如果setDirection设置为倒序,返回值也是倒序
        print('当前总循环内时长是:', s)
        s=self.ani.direction() #返回动画方向
        # 返回值 int
        #1  表示倒序;0  表示 顺序
        print('动画方向:',s)

    def BB(self):
        #self.ani.pause() #暂停
        self.ani.setPaused(True) #是否暂停
        s=self.ani.State() #返回动画的状态
        #QAbstractAnimation.Paused=1 暂停状态
        #QAbstractAnimation.Stopped=0   停止状态
        #QAbstractAnimation.Running=2   运行状态
        print(s)

    def CC(self):
        #self.ani.resume() #恢复暂停--继续
        self.ani.setPaused(False) # 是否暂停
        s = self.ani.State()  # 返回动画的状态
        print(s)

    def DD(self):
        self.ani.stop() #停止

    def EE(self):
        self.ani.setCurrentTime(14000) #设置当前动画时间--按总时长计算--毫秒

    def FF(self,n):
        print('当前循环遍数是:',n)

    def HH(self):
        print('动画播放完毕')

    def GG(self,z,z1):
        print('新状态是:',z)
        print('老状态是:',z1)


if __name__=='__main__':
    app=QApplication(sys.argv)
    w=win()
    w.show()
    sys.exit(app.exec_())

 

 

 

 

 

 

 

天子骄龙


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM