098.PyQt5_补充_属性动画及其父类

在这里插入图片描述

我 的 个 人 主 页: 失心疯的个人主页
入 门 教 程 推 荐 : Python零基础入门教程合集
虚 拟 环 境 搭 建 : Python项目虚拟环境(超详细讲解)
PyQt5 系 列 教 程: Python GUI(PyQt5)文章合集
Oracle数据库教程: Oracle数据库文章合集
优 质 资 源 下 载 : 资源下载合集

在这里插入图片描述

属性动画及其父类

  • 作用

    • 做一些过渡的动画效果
    • 如:控件从一个位置移动到另一个位置、控件的尺寸大小变化等
  • 动画类继承结构图

    • 098.PyQt5_补充_属性动画及其父类_第1张图片
  • 动画类说明

     QAbstractAnimation                    # 动画基类(抽象类)
         QVariantAnimation                 # 属性动画父类
             QPropertyAnimation            # 属性动画类(按照动画效果修改控件的属性,如:pos<位置>、size<大小>等)
         QPauseAnimation                   # 暂停动画类
         QAnimationGroup                   # 动画分组类(把多个单个的动画分到一组,让这些动画同时启停或者按顺序启停)
             QParallelAnimationGroup       # 并行动画组类
             QSequentialAnimationGroup     # 串行动画组类
    

QPropertyAnimation

  • 描述
    • 属性动画类,用于实现某个属性值从a到b的动画变化
  • 继承自:QVariantAnimation
  • 功能作用
    • 构造函数
      QPropertyAnimation(parent)                              # 创建动画对象的同时设置父对象
      QPropertyAnimation(target, propertyName, parent)        # 创建动画对象的同时设置绑定对象和属性,并设置父对象
      
    • 动画绑定对象
      setTargetObject(self,QObject)                           # 设置动画绑定对象(控件)
      targetObject(self)                                      # 获取动画绑定对象
      
    • 动画目标属性
      setPropertyName(self, propertyName: Union[QByteArray, bytes, bytearray])    # 设置要绑定动画的属性
      # 注意:设置属性名称的时候,需要以字节的方式设置。如:b'pos' , b'size'
      propertyName(self)                                      # 获取绑定了动画的属性,返回QByteArray
      
    • 常用属性
      pos                 # 位置属性,通过QPoint对象设置
      size                # 尺寸属性,通过QSize对象设置
      geometry            # 尺寸和位置属性,通过QRect对象设置
      windowOpacity       # 不透明度属性,从1.0到0.0,从不透明到完全透明
      
    • 设置开始值、结束值和关键值
      setStartValue(self, value)              # 设置开始值
      setEndValue(self, value)                # 设置结束值
      setKeyValueAt(self, step, value)        # 设置关键值,step:从0.0到1.0,表示动画时长中的一个点
      # 在这个地方step用分数表示更好理解,setKeyValueAt(1/2, 0)即表示动画时长的1/2处时,属性值由开始值变成0
      setKeyValues(self, values)              # 设置关键值组,通过迭代器设置多个关键值
      # values: Iterable[Tuple[float, Any]]
      # animation.setKeyValues([(0, 1), (0.5, 0), (1, 1)])  # 设置关键值组,通过迭代器设置多个关键值
      
    • 设置动画时长
      setDuration(int msecs)                  # 设置单次动画时长
      
    • 设置动画曲线
      setEasingCurve(self, easing)        # 设置动画曲线
      # easing: Union[QEasingCurve, QEasingCurve.Type]
      
      # easing常用值
          # Linear 		# 匀速
          # InQuad 		# 由慢到快
          # OutQuad 		# 由快到慢
          # InBounce 		# 开始时弹簧效果
          # OutBounce 	# 结束时弹簧效果
      
      • QEasingCurve枚举值:https://doc.qt.io/qt-5/qeasingcurve.html#Type-enum
      • QEasingCurve枚举值:https://blog.csdn.net/weixin_50296259/article/details/130774173
    • 启动动画
      start()             # 启动动画
      
    • 实现动画步骤
      # 1. 创建动画对象,并绑定控件、属性
      # 2. 设置开始值、关键值、结束值
      # 3. 设置动画时长
      # 4. 设置动画曲线
      # 5. 启动动画
      
    • 动画示例代码
      from PyQt5.Qt import *
      import sys
      
      
      class Windows(QWidget):
          def __init__(self):
              super().__init__()
              self.setWindowTitle('动画学习')
              self.resize(500, 500)
              self.widget_list()
      
          def widget_list(self):
              self.add_widget()
      
          def add_widget(self):
              btn = QPushButton('测试', self)
              btn.resize(100, 100)
      
              # 1. 创建动画对象,并绑定控件、属性
              # 方法一
              # animation = QPropertyAnimation(self)    # 创建动画对象
              # animation.setTargetObject(btn)          # 绑定控件
              # animation.setPropertyName(b"pos")         # 绑定属性
              # 方法二
              animation = QPropertyAnimation(btn, b"pos", self)                 # 位置属性
              # animation = QPropertyAnimation(btn, b"size", self)                # 大小属性
              # animation = QPropertyAnimation(btn, b'geometry', self)            # 位置和大小属性
              # animation = QPropertyAnimation(self, b'windowOpacity', self)        # 不透明度属性
      
              # 2. 设置开始值、关键值、结束值
              animation.setStartValue(QPoint(0, 0))       # 设置开始pos值
              animation.setEndValue(QPoint(400, 400))     # 设置结束pos值
      
              # animation.setStartValue(QSize(100, 100))    # 设置开始size值
              # animation.setEndValue(QSize(400, 400))      # 设置结束size值
      
              # animation.setStartValue(QRect(0, 0, 50, 50))      # 设置开始geometry值
              # animation.setEndValue(QRect(300, 300, 200, 200))  # 设置结束geometry值
      
              # animation.setStartValue(1)                  # 设置开始值,在动画开始时windowOpacity属性的值为0
              # animation.setKeyValueAt(1/2, 0)             # 设置关键值,在动画时长的1/2处,windowOpacity属性的值由1变为0
              # animation.setEndValue(1)                    # 设置结束值,在动画结束时,windowOpacity属性的值由0变为1
              # animation.setKeyValues([(0, 1), (0.5, 0), (1, 1)])  # 设置关键值组,通过迭代器设置多个关键值
      
              # 3. 设置动画时长
              animation.setDuration(1000)
      
              # 4. 设置动画曲线
              # animation.setEasingCurve(QEasingCurve.Linear)         # 匀速,默认
              # animation.setEasingCurve(QEasingCurve.InQuad)         # 由慢到快
              # animation.setEasingCurve(QEasingCurve.OutQuad)        # 由快到慢
              # animation.setEasingCurve(QEasingCurve.InBounce)       # 开始时弹簧效果
              animation.setEasingCurve(QEasingCurve.OutBounce)        # 结束时弹簧效果
      
              # 5. 启动动画
              animation.start()
      
      
      if __name__ == '__main__':
          app = QApplication(sys.argv)
          window = Windows()
      
          window.show()
          sys.exit(app.exec_())
      

QVariantAnimation

  • 继承自:QAbstractAnimation
  • 功能作用
    • 设置开始值、结束值和关键值
      setStartValue(self, value)              # 设置开始值
      startValue()                            # 获取开始值,返回QVariant
      
      setEndValue(self, value)                # 设置结束值
      endValue()                              # 获取结束值,返回QVariant
      
      setKeyValueAt(self, step, value)        # 设置关键值,step:从0.0到1.0,表示动画时长中的一个点
      keyValueAt()                            # 获取关键值,返回QVariant
      # 在这个地方step用分数表示更好理解,setKeyValueAt(1/2, 0)即表示动画时长的1/2处时,属性值由开始值变成0
      setKeyValues(self, values)              # 设置关键值组,通过迭代器设置多个关键值
      keyValues()                             # 获取关键值组,返回QVariantAnimation
      # values: Iterable[Tuple[float, Any]]
      # animation.setKeyValues([(0, 1), (0.5, 0), (1, 1)])        # 设置关键值组,通过迭代器设置多个关键值
      
    • 设置动画时长
      setDuration(int msecs)				# 设置单次动画时长
      
    • 设置动画曲线
      setEasingCurve(self, easing)        # 设置动画曲线
      # easing: Union[QEasingCurve, QEasingCurve.Type]
      
      # easing常用值
          # Linear 		# 匀速
          # InQuad 		# 由慢到快
          # OutQuad 		# 由快到慢
          # InBounce 		# 开始时弹簧效果
          # OutBounce 	# 结束时弹簧效果
      
      • QEasingCurve枚举值:https://doc.qt.io/qt-5/qeasingcurve.html#Type-enum
      • QEasingCurve枚举值:https://blog.csdn.net/weixin_50296259/article/details/130774173

QAbstractAnimation

  • 描述
    • 所有动画共享的功能,抽象类
    • 继承此类,实现一些自定义动画
  • 功能作用
    • 循环操作
      setLoopCount(int loopCount)                 # 设置动画循环次数
      loopCount() ——> int                         # 获取设置的动画循环总次数
      currentLoop() ——> int                       # 获取动画的当前循环次数,从0开始
      currentLoopTime() ——> int                   # 获取当前循环内的时间(从当次循环开始计算时间)
      
    • 动画方向
      setDirection(QAbstractAnimation.Direction)          # 设置动画方向
      dirction() ——> QAbstractAnimation.Direction         # 获取动画方向
      
      # 参数 QAbstractAnimation.Direction
          # QAbstractAnimation.Forward                    # 按时间正顺运行
          # 即 从开始值到结束值
          # QAbstractAnimation.Backward                   # 按时间倒序运行
          # 即 从结束值到开始值(类似于视频倒放)
      
    • 时间操作
      duration() ——> int                          # 获取单次动画时长
      toralDuration() ——> int                     # 获取动画总时长
      currentTime() ——> int                       # 获取动画当前时长
      currentLoopTime() ——> int                   # 获取当前循环内的当前时间(从当次循环开始计算时间)
      
    • 常用操作
      pause()                                     # 暂停动画,可恢复运行
      resume()                                    # 继续动画,恢复暂停的动画
      stop()                                      # 停止动画,不可恢复运行
      start(QAbstractAnimation.DeletionPolicy)    # 开始动画,并可以设置删除策略
      # 参数 QAbstractAnimation.DeletionPolicy
          # QAbstractAnimation.KeepWhenStopped    # 停止动画时不删除动画
          # QAbstractAnimation.DeleteWhenStopped  # 停止动画时自动删除动画
      setCurrentTime(int)                         # 设置当前时间
      setPause(bool)                              # 设置是否暂停(相当于pause()+resume())
      
    • 动画状态
      state() ——> QAbstractAnimation.State                # 获取动画当前状态
      # 参数 QAbstractAnimation.State
          # QAbstractAnimation.Stopped                    # 停止状态,0
          # QAbstractAnimation.Paused                     # 暂停状态,1
          # QAbstractAnimation.Running                    # 运行状态,2
      
  • 常用信号
    currentLoopChanged(int currentLoop)         # 当前循环次数发生改变时发射该信号,并传递当前循环次数
    directionChanged(newDirection)              # 动画方向发生改变时发射该信号,并传递新的动画方向(QAbstractAnimation.Direction)
    finished()                                  # 动画所有循环完成时发射该信号
    stateChanged(newState, oldState)            # 动画状态发生改变时发射该信号,并传递新状态和老状态(QAbstractAnimation.State)
    
  • 示例动画
    from PyQt5.Qt import *
    import sys
    
    
    class Windows(QWidget):
        def __init__(self):
            super().__init__()
            self.setWindowTitle('QAbstractAnimation-功能作用')
            self.resize(500, 300)
            self.btn2 = QObject
            self.animation = QObject
            self.widget_list()
    
        def widget_list(self):
            self.add_widget()
    
        def add_widget(self):
            btn = QPushButton(self)
            self.btn = btn
            btn.resize(50, 50)
    
            btn1 = QPushButton('获取循环信息', self)
            btn1.setObjectName('btn1')
            btn1.resize(100, 30)
            btn1.move(50, 100)
    
            btn2 = QPushButton('设置动画方向', self)
            self.btn2 = btn2
            btn2.setObjectName('btn2')
            btn2.resize(100, 30)
            btn2.move(170, 100)
    
            btn3 = QPushButton('开始动画', self)
            self.btn3 = btn3
            btn3.setObjectName('btn3')
            btn3.resize(100, 30)
            btn3.move(50, 140)
    
            btn4 = QPushButton('暂停动画', self)
            self.btn4 = btn4
            btn4.setObjectName('btn4')
            btn4.resize(100, 30)
            btn4.move(170, 140)
    
    
    
            # 定义动画,设置绑定控件对象和属性
            animation = QPropertyAnimation(btn, b'pos', self)
            animation.setObjectName('animation')
            self.animation = animation
            # 通过关键值组设置开始值、关键值和结束值
            animation.setKeyValues([(0, QPoint(0, 0)), (1/2, QPoint(450, 0)), (1, QPoint(0, 0))])
            # 设置单个动画总时长
            animation.setDuration(3000)
    
            # 设置动画循环次数
            animation.setLoopCount(3)
            # animation.currentLoopChanged.connect(lambda v: print(f'动画当前循环第【{v}】次'))
            # animation.directionChanged.connect(lambda v:print('动画方向发生了改变', v))
            # animation.finished.connect(lambda :print('动画所有循环都完成了!'))
            # animation.stateChanged.connect(lambda ns,os:print(f'动画状态由{os}变成了{ns}'))
            # 启动动画
            # animation.start()
    
            # 设置self对象开启装饰器自动连接信号与槽
            QMetaObject.connectSlotsByName(self)
    
        def stop_animation(self):
            if self.animation.direction() == QAbstractAnimation.Backward:
                self.btn.move(450, 0)
            elif self.animation.direction() == QAbstractAnimation.Forward:
                self.btn.move(0, 0)
            self.animation.stop()
            self.btn3.setText('开始动画')
    
        def start_animation(self):
            self.animation.start()
            self.btn3.setText('停止动画')
    
        @pyqtSlot()
        def on_btn1_clicked(self):
            print('动画循环总次数:', self.animation.loopCount())
            print('动画当前循环次数:', self.animation.currentLoop())
            print('动画当前循环时间:', self.animation.currentLoopTime())
            print('')
    
        @pyqtSlot()
        def on_btn2_clicked(self):
            self.animation.setKeyValues([(0, QPoint(0, 0)), (1, QPoint(450, 0))])
            self.stop_animation()
            if self.animation.direction() == QAbstractAnimation.Backward:
                self.animation.setDirection(QAbstractAnimation.Forward)
                self.btn2.setText('倒序运行')
            elif self.animation.direction() == QAbstractAnimation.Forward:
                self.animation.setDirection(QAbstractAnimation.Backward)
                self.btn2.setText('正序运行')
            self.start_animation()
    
        @pyqtSlot()
        def on_btn3_clicked(self):
            if self.animation.state() == QAbstractAnimation.Stopped:
                self.start_animation()
                self.btn3.setText('停止动画')
            elif self.animation.state() == QAbstractAnimation.Running:
                self.stop_animation()
                self.btn3.setText('开始动画')
    
        @pyqtSlot()
        def on_btn4_clicked(self):
            if self.animation.state() == QAbstractAnimation.Running:
                self.animation.pause()
                self.btn4.setText('恢复动画')
            elif self.animation.state() == QAbstractAnimation.Paused:
                self.animation.resume()
                self.btn4.setText('暂停动画')
    
        @pyqtSlot(int)
        def on_animation_currentLoopChanged(self, current_loop):
            print(f'当前循环第【{current_loop}】次')
    
        def on_animation_directionChanged(self, new_direction):
            print(f'动画方向发生了改变,当前方向为:{new_direction}')
    
        def on_animation_finished(self):
            print('动画完成了!')
    
        def on_animation_stateChanged(self, ns, os):
            print(f'动画状态由{os}变成了{ns}')
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        window = Windows()
    
        window.show()
        sys.exit(app.exec_())
    

你可能感兴趣的:(PyQt5,pyqt5,python,pyqt,python,GUI,qt5)