本章来了解一下比较实用的一个动画效果,称为属性动画,但是属性动画有很多种,今天我们说的是文本移动。主要作用于标签移动。
没错,就是它了,主要目的就是让它动起来。
在此之前,需要了解一下使用哪些库来操作。属性动画嘛,所以对应的库就是QPropertyAnimation。知道库了。那么还需要了解一下其中的方法。
class QPropertyAnimation(QVariantAnimation): """ QPropertyAnimation(parent: typing.Optional[QObject] = None) QPropertyAnimation(target: QObject, propertyName: Union[QByteArray, bytes, bytearray], parent: typing.Optional[QObject] = None) """
第一个参数是所需要作用的对象,另一个就是属性了,其中的常用属性有:
- 位置属性:b"pos" - 控件的左上角坐标点,可以使控件平滑移动。
- 大小属性:b"size" - 控件的宽度和高度,可以使控件平滑改变大小。
- 透明度属性:b"opacity" - 控件的透明度,可以使控件平滑改变透明度。
- 旋转属性:b"rotation" - 控件的旋转角度,可以使控件平滑旋转。
- 几何属性:b"geometry" - 控件的位置和大小,可以同时实现控件平滑移动和改变大小。
而今天要用到的就是第五个,b"geometry"。
如何实现呢?肯定是需要一个QLabel的,也就是这样写:
QPropertyAnimation(self.label, b"geometry")
前期的Ui搭建就不细说了,直接上代码:
import sys from PyQt5.QtWidgets import QApplication, QWidget, QLabel from PyQt5.QtCore import Qt, QPropertyAnimation, QRectF class MovingTextWidget(QWidget): def __init__(self): super().__init__() self.init_ui() def init_ui(self): self.setGeometry(100, 100, 400, 100) # 创建一个 QLabel 来显示文本 self.label = QLabel("开发者: 清安", self) self.label.setAlignment(Qt.AlignCenter) self.label.setStyleSheet("font-size: 20px;")
就这样简单,没有别的东西了。剩下的就是写动画代码了,接着看:
首先我们需要实例化方法,然后设置动画时长,在设置启动位置以及结束位置,最后启动即可。来看看代码
# 创建一个动画对象,设置属性名称为 "geometry",从初始位置(0, 0) 到 (400, 100) 平滑过渡 self.animation = QPropertyAnimation(self.label, b"geometry") self.animation.setDuration(2000) # 设置动画时长为 3 秒 self.animation.setStartValue(QRectF(0, 0, 0, 20)) # 初始位置 self.animation.setEndValue(QRectF(0, 0, 400, 20)) # 结束位置 # 启动动画 self.animation.start()
其实位置的QRectF参数,是可以调节的,除了上述代码的平行移动,可以上下左右,弧线移动。
上述代码存在一个问题,就是,只能移动一次。那么再来优化一下:
import sys from PyQt5.QtWidgets import QApplication, QWidget, QLabel from PyQt5.QtCore import Qt, QPropertyAnimation, QRectF class MovingTextWidget(QWidget): def __init__(self): super().__init__() self.init_ui() def init_ui(self): self.setGeometry(100, 100, 400, 100) # 创建一个 QLabel 来显示文本 self.label = QLabel("开发者: 清安", self) self.label.setAlignment(Qt.AlignCenter) self.label.setStyleSheet("font-size: 20px;") # 创建一个动画对象,设置属性名称为 "geometry",从初始位置(0, 0) 到 (400, 100) 平滑过渡 self.animation = QPropertyAnimation(self.label, b"geometry") self.animation.setDuration(2000) # 设置动画时长为 3 秒 self.animation.setStartValue(QRectF(0, 0, 0, 20)) # 初始位置 self.animation.setEndValue(QRectF(0, 0, 400, 20)) # 结束位置 # 信号连接到槽函数,当动画结束时执行 self.animation.finished.connect(self.reset_animation) # 启动动画 self.animation.start() def reset_animation(self): # 重置动画,将文本移回起始位置 self.animation.setDirection(QPropertyAnimation.Backward) self.animation.start()
这样就能看到它在指定范围内移动了。甚至你可以让它文字一直变化。
剩下的就是将已经实现的功能嵌入到项目中去就好了,记得修改QLabel的对象名