pyqt曲线轨迹运动
- pyqt QPropertyAnimation介绍
- 曲线轨迹运动
- 代码
pyqt QPropertyAnimation介绍
QPropertyAnimation 是 PyQt中的一个类,它用于对 Qt 对象的属性进行动画处理。通过使用 QPropertyAnimation,你可以平滑地改变一个对象的属性值,例如窗口的位置、大小、颜色等。
曲线轨迹运动
代码
# 导入必要的PyQt5模块
from PyQt5.QtWidgets import QApplication, QWidget, QLabel
from PyQt5.QtGui import QPainter, QPixmap, QPainterPath
from PyQt5.QtCore import QObject, QPointF, QPropertyAnimation, pyqtProperty
import sys# 自定义的Ball类,继承自QLabel
class Ball(QLabel):def __init__(self, parent):super().__init__(parent) # 调用父类QLabel的构造函数# 加载图片并设置到QLabel上pix = QPixmap("car.png")self.h = pix.height() # 图片的高度self.w = pix.width() # 图片的宽度self.setPixmap(pix)# 自定义setter方法,用于更新Ball的位置def _set_pos(self, pos):# 移动QLabel到新的位置,考虑图片的中心点self.move(int(pos.x() - self.w / 2), int(pos.y() - self.h / 2))# 使用pyqtProperty将_set_pos方法包装为一个属性,以便与Qt属性系统兼容pos = pyqtProperty(QPointF, fset=_set_pos)# 自定义的Example类,继承自QWidget
class Example(QWidget):def __init__(self):super().__init__() # 调用父类QWidget的构造函数# 初始化视图和动画self.initView()self.initAnimation()# 初始化视图def initView(self):# 创建一个QPainterPath对象,并设置其路径self.path = QPainterPath()self.path.moveTo(30, 30)self.path.cubicTo(30, 30, 200, 350, 350, 30)# 创建一个Ball对象,并添加到当前窗口上self.ball = Ball(self)# 设置Ball的初始位置(这里虽然直接设置了属性,但它是通过pyqtProperty定义的,所以没有问题)self.ball.pos = QPointF(30, 30)# 设置窗口标题和大小,并显示窗口self.setWindowTitle("Animation along curve")self.setGeometry(300, 300, 400, 300)self.show()# 重写paintEvent方法,用于绘制QPainterPathdef paintEvent(self, e):qp = QPainter()qp.begin(self) # 开始绘制qp.setRenderHint(QPainter.Antialiasing) # 设置抗锯齿渲染qp.drawPath(self.path) # 绘制QPainterPathqp.end() # 结束绘制# 初始化动画def initAnimation(self):# 创建一个QPropertyAnimation对象,用于动画化Ball的pos属性self.anim = QPropertyAnimation(self.ball, b'pos')self.anim.setDuration(7000) # 设置动画时长为7000毫秒(7秒)# 设置动画的起始值self.anim.setStartValue(QPointF(30, 30))# 创建一个列表,用于计算贝塞尔曲线上的点vals = [p / 100 for p in range(0, 101)]# 为动画设置关键帧值for i in vals:self.anim.setKeyValueAt(i, self.path.pointAtPercent(i))# 设置动画的结束值(虽然在这里设置了,但实际上由于关键帧的存在,这个值可能不会被直接使用)self.anim.setEndValue(QPointF(350, 30))self.anim.start() # 开始动画# 主程序入口
if __name__ == '__main__':app = QApplication(sys.argv) # 创建QApplication对象ex = Example() # 创建Example对象(即主窗口)sys.exit(app.exec_()) # 进入Qt的事件循环,等待用户操作,直到应用程序关闭