我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈
入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈
虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈
PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈
Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈
优 质 资 源 下 载 :👉👉 资源下载合集 👈👈
属性动画及其父类
-
作用
- 做一些过渡的动画效果
- 如:控件从一个位置移动到另一个位置、控件的尺寸大小变化等
-
动画类继承结构图
-
动画类说明
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对象设置<QPint(x, y)> size # 尺寸属性,通过QSize对象设置<QSize(w, h)> geometry # 尺寸和位置属性,通过QRect对象设置<QRect(x, y, w, h)> 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_())