qt-C++笔记之动画框架(Qt Animation Framework)入门

qt-C++笔记之动画框架(Qt Animation Framework)入门

code review!

在 Linux 平台上,使用 C++ 和 Qt 框架实现动画是一个非常好的选择。Qt 提供了强大的动画框架(Qt Animation Framework),使得动画的实现变得简单高效。下面将介绍 Qt 动画的基本概念与入门使用,并进一步探讨 QTimeLineQEasingCurve 的用法,以及 Qt 动画框架中几个重要的类之间的区别。

文章目录

  • [qt-C++笔记之动画框架(Qt Animation Framework)入门![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/16fd93a4737d4ab7bf8f9e820fc36cdb.png#pic_center =600x)](#pic_center =600x))
    • [1. Qt 动画框架简介](#1. Qt 动画框架简介)
      • [1.1 核心类](#1.1 核心类)
        • [1.1.1 QPropertyAnimation](#1.1.1 QPropertyAnimation)
        • [1.1.2 QSequentialAnimationGroup](#1.1.2 QSequentialAnimationGroup)
        • [1.1.3 QParallelAnimationGroup](#1.1.3 QParallelAnimationGroup)
        • [1.1.4 QGraphicsItemAnimation](#1.1.4 QGraphicsItemAnimation)
        • [1.1.5 QAnimationDriver](#1.1.5 QAnimationDriver)
      • [1.2 动画作用域](#1.2 动画作用域)
        • [1.2.1 UI 部件动画](#1.2.1 UI 部件动画)
        • [1.2.2 场景动画](#1.2.2 场景动画)
        • [1.2.3 自定义动画](#1.2.3 自定义动画)
    • [2. 简单动画示例](#2. 简单动画示例)
      • [2.1 示例 1:移动一个按钮](#2.1 示例 1:移动一个按钮)
        • [2.1.1 代码说明](#2.1.1 代码说明)
    • [3. 组合动画](#3. 组合动画)
      • [3.1 示例 2:顺序执行多个动画](#3.1 示例 2:顺序执行多个动画)
      • [3.2 示例 3:并行执行多个动画](#3.2 示例 3:并行执行多个动画)
    • [4. 自定义动画曲线](#4. 自定义动画曲线)
      • [4.1 常用曲线类型](#4.1 常用曲线类型)
      • [4.2 自定义动画曲线示例](#4.2 自定义动画曲线示例)
    • [5. 在 QGraphicsView 中实现动画](#5. 在 QGraphicsView 中实现动画)
    • [6. 总结](#6. 总结)
    • [7. QTimeLine 是什么](#7. QTimeLine 是什么)
      • [7.1 核心功能](#7.1 核心功能)
      • [7.2 关键属性和方法](#7.2 关键属性和方法)
      • [7.3 常见动画曲线(CurveShape)](#7.3 常见动画曲线(CurveShape))
      • [7.4 QTimeLine 的信号](#7.4 QTimeLine 的信号)
      • [7.5 简单用法示例](#7.5 简单用法示例)
      • [7.6 进阶用法:配合 QGraphicsItemAnimation](#7.6 进阶用法:配合 QGraphicsItemAnimation)
      • [7.7 优缺点与结论](#7.7 优缺点与结论)
    • [8. QTimeLine 和 QEasingCurve 的区别](#8. QTimeLine 和 QEasingCurve 的区别)
      • [8.1 一、核心区别](#8.1 一、核心区别)
      • [8.2 二、QTimeLine 详解](#8.2 二、QTimeLine 详解)
      • [8.3 三、QEasingCurve 详解](#8.3 三、QEasingCurve 详解)
      • [8.4 四、两者关系与配合](#8.4 四、两者关系与配合)
      • [8.5 五、总结对比](#8.5 五、总结对比)
    • [9. QAbstractAnimation、QVariantAnimation 和 QPropertyAnimation 的区别](#9. QAbstractAnimation、QVariantAnimation 和 QPropertyAnimation 的区别)
      • [9.1 一、继承关系](#9.1 一、继承关系)
      • [9.2 二、核心区别](#9.2 二、核心区别)
      • [9.3 三、详细分析](#9.3 三、详细分析)
        • [9.3.1.`QAbstractAnimation` 示例:自定义动画基类](#9.3.1.QAbstractAnimation 示例:自定义动画基类)
        • [9.3.2.`QVariantAnimation` 示例:插值动画](#9.3.2.QVariantAnimation 示例:插值动画)
        • [9.3.3.`QPropertyAnimation` 示例:操作对象的属性动画](#9.3.3.QPropertyAnimation 示例:操作对象的属性动画)
        • 9.3.4.区别总结
      • [9.4 四、对比总结](#9.4 四、对比总结)

1. Qt 动画框架简介

1.1 核心类

1.1.1 QPropertyAnimation
  • 用于对对象属性(如位置、大小、透明度等)进行动画处理,直接操作 QObject 的特定属性。
1.1.2 QSequentialAnimationGroup
  • 用于按顺序播放多个动画。
1.1.3 QParallelAnimationGroup
  • 用于并行播放多个动画。
1.1.4 QGraphicsItemAnimation
  • 用于对 QGraphicsItem(图形场景中的对象)进行动画处理。
  • 通常与 QTimeLine 搭配使用。
1.1.5 QAnimationDriver
  • 自定义动画的驱动类,用于更底层地控制动画刷新。

1.2 动画作用域

1.2.1 UI 部件动画
  • 对 GUI 组件(如按钮、窗口等)进行动画处理(位置、大小、透明度等)。
1.2.2 场景动画
  • QGraphicsView 场景中的对象进行动画处理,适合做复杂的 2D 场景交互或游戏等。
1.2.3 自定义动画
  • 如果需要更复杂的动画效果,可以自定义动画逻辑或插值方式。

2. 简单动画示例

2.1 示例 1:移动一个按钮

下面的示例展示了如何使用 QPropertyAnimation 将一个按钮从左上角平滑移动到右下角,并添加弹跳效果:

cpp 复制代码
#include <QApplication>
#include <QPushButton>
#include <QPropertyAnimation>
#include <QEasingCurve>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建一个按钮
    QPushButton button("Move Me");
    button.resize(100, 50);
    button.show();

    // 创建一个属性动画
    QPropertyAnimation *animation = new QPropertyAnimation(&button, "geometry");
    // 设置动画时长 2 秒
    animation->setDuration(2000);
    // 动画的起始位置
    animation->setStartValue(QRect(0, 0, 100, 50));
    // 动画的结束位置
    animation->setEndValue(QRect(300, 300, 100, 50));
    // 设置动画曲线(弹跳效果)
    animation->setEasingCurve(QEasingCurve::OutBounce);

    // 开始动画
    animation->start();

    return app.exec();
}

运行

2.1.1 代码说明
  1. QPropertyAnimation animation(&button, "geometry")

    • 指定了对按钮的 geometry 属性进行动画,geometry 决定了部件的在屏幕上的位置和大小。
  2. setStartValuesetEndValue

    • 分别设定了动画的初始位置和结束位置。
  3. setEasingCurve(QEasingCurve::OutBounce)

    • 设置了弹跳缓动曲线,动画结束时会呈现弹跳的效果。

3. 组合动画

有时我们需要在一个动画之后紧接着播放另一个动画,或者同时播放多个动画,这可以使用 QSequentialAnimationGroupQParallelAnimationGroup 来实现。

3.1 示例 2:顺序执行多个动画

cpp 复制代码
#include <QApplication>
#include <QPushButton>
#include <QPropertyAnimation>
#include <QSequentialAnimationGroup>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QPushButton button("Animate Me");
    button.resize(100, 50);
    button.show();

    // 创建两个属性动画
    QPropertyAnimation *animation1 = new QPropertyAnimation(&button, "geometry");
    animation1->setDuration(1000);
    animation1->setStartValue(QRect(0, 0, 100, 50));
    animation1->setEndValue(QRect(300, 0, 100, 50));

    QPropertyAnimation *animation2 = new QPropertyAnimation(&button, "geometry");
    animation2->setDuration(1000);
    animation2->setStartValue(QRect(300, 0, 100, 50));
    animation2->setEndValue(QRect(300, 300, 100, 50));

    // 创建一个顺序动画组
    QSequentialAnimationGroup group;
    group.addAnimation(animation1);
    group.addAnimation(animation2);

    // 开始动画
    group.start();

    return app.exec();
}

运行

3.2 示例 3:并行执行多个动画

cpp 复制代码
#include <QApplication>
#include <QPushButton>
#include <QLabel>
#include <QPropertyAnimation>
#include <QParallelAnimationGroup>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QPushButton button("Button");
    QLabel label("Label");
    button.resize(100, 50);
    label.resize(100, 50);

    button.show();
    label.show();

    // 创建属性动画
    QPropertyAnimation *buttonAnimation = new QPropertyAnimation(&button, "geometry");
    buttonAnimation->setDuration(2000);
    buttonAnimation->setStartValue(QRect(0, 0, 100, 50));
    buttonAnimation->setEndValue(QRect(300, 300, 100, 50));

    QPropertyAnimation *labelAnimation = new QPropertyAnimation(&label, "geometry");
    labelAnimation->setDuration(2000);
    labelAnimation->setStartValue(QRect(0, 300, 100, 50));
    labelAnimation->setEndValue(QRect(300, 0, 100, 50));

    // 创建一个并行动画组
    QParallelAnimationGroup group;
    group.addAnimation(buttonAnimation);
    group.addAnimation(labelAnimation);

    // 开始动画
    group.start();

    return app.exec();
}

运行

4. 自定义动画曲线

Qt 提供了多种内置的动画曲线,比如线性、弹跳、缓动等。如果默认曲线无法满足需求,还可以使用 QEasingCurve 自定义动画曲线。

4.1 常用曲线类型

  • QEasingCurve::Linear:线性插值
  • QEasingCurve::InQuad:缓入二次方
  • QEasingCurve::OutBounce:弹跳效果

4.2 自定义动画曲线示例

cpp 复制代码
QEasingCurve customCurve([](qreal t) -> qreal {
    // 这里使用简单的二次函数曲线 y = t^2
    return t * t;
});
animation->setEasingCurve(customCurve);

5. 在 QGraphicsView 中实现动画

如果使用 QGraphicsViewQGraphicsItem,可以通过 QGraphicsItemAnimation + QTimeLine 进行更灵活的动画控制。以下示例演示了如何为图形项做一个旋转动画:

cpp 复制代码
#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QTimeLine>
#include <QGraphicsItemAnimation>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QGraphicsView view;
    QGraphicsScene scene;
    view.setScene(&scene);

    QGraphicsRectItem *rect = scene.addRect(0, 0, 100, 100);

    QTimeLine *timer = new QTimeLine(2000);
    timer->setFrameRange(0, 100);

    QGraphicsItemAnimation *animation = new QGraphicsItemAnimation;
    animation->setItem(rect);
    animation->setTimeLine(timer);

    for (int i = 0; i <= 100; ++i) {
        // 让矩形在 2 秒内旋转 360 度
        animation->setRotationAt(i / 100.0, i * 3.6);
    }

    timer->start();
    view.show();

    return app.exec();
}

实际运行程序

cpp 复制代码
#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QTimeLine>
#include <QGraphicsItemAnimation>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建视图和场景
    QGraphicsView view;
    view.move(100, 100); // 屏幕左上角 (100, 100)
    QGraphicsScene scene;
    view.setScene(&scene);

    view.setFixedSize(300, 300); // 窗口大小
    view.setWindowTitle("Animation Demo"); // 窗口标题

    // 设置场景范围
    scene.setSceneRect(0, 0, 300, 300);

    // 添加矩形
    QGraphicsRectItem *rect = scene.addRect(0, 0, 100, 100);
    rect->setPos(100, 100); // 矩形的初始位置

    // 创建时间线和动画
    QTimeLine *timer = new QTimeLine(2000);
    timer->setFrameRange(0, 100);

    QGraphicsItemAnimation *animation = new QGraphicsItemAnimation;
    animation->setItem(rect);
    animation->setTimeLine(timer);

    for (int i = 0; i <= 100; ++i) {
        // 让矩形在 2 秒内旋转 360 度
        animation->setRotationAt(i / 100.0, i * 3.6);
    }

    // 启动动画并显示视图
    timer->start();
    view.show();

    return app.exec();
}

运行

6. 总结

Qt 提供了非常强大的动画框架,适用于各种场景,包括简单的 UI 动画、复杂的场景动画,以及自定义动画效果。建议先从 QPropertyAnimation 入门,熟悉后再学习 QSequentialAnimationGroupQParallelAnimationGroup 的组合用法,以及在 QGraphicsView 场景中使用 QGraphicsItemAnimation。如果需要更现代化、更丰富的动画效果,还可以进一步探索 QML 动画与 C++ 的结合。

7. QTimeLine 是什么

QTimeLine 是 Qt 提供的一个时间驱动类,主要用于控制动画的时间轴。它可以生成一个时间流,用来精确地管理动画的时长、帧数、循环次数以及动画曲线等。

7.1 核心功能

  • 控制动画的时间流(定时触发事件或更新插值)
  • 配合 QGraphicsItemAnimation 使用
  • 自定义动画的加速、减速或循环模式

7.2 关键属性和方法

属性/方法 描述
setDuration(int ms) 设置动画总时长(毫秒)。
setFrameRange(int start, int end) 设置帧范围。
setCurveShape(QTimeLine::CurveShape) 设置动画曲线(如线性、缓入、缓出等)。
start() 开始动画。
stop() 停止动画。
valueForTime(int ms) 根据当前时间计算动画进度值(通常在 [0.0, 1.0])。
setUpdateInterval(int ms) 设置更新间隔(毫秒)。
setLoopCount(int loops) 设置动画循环次数(0 表示无限循环)。
state() 获取当前动画状态(Running、Paused、Stopped 等)。

7.3 常见动画曲线(CurveShape)

曲线类型 描述
LinearCurve 线性变化,恒定速度
EaseInCurve 缓入曲线,开始时慢,后期加速
EaseOutCurve 缓出曲线,开始时快,后期减速
EaseInOutCurve 缓入缓出曲线,开始结束时都较慢
SineCurve 正弦曲线,平滑的缓入缓出变化
CosineCurve 余弦曲线,与正弦曲线类似

7.4 QTimeLine 的信号

信号 描述
frameChanged(int frame) 当前帧改变时触发
valueChanged(qreal value) 当前进度值改变时触发(范围 [0.0, 1.0])
stateChanged(State newState) 动画状态改变时触发
finished() 动画结束时触发

7.5 简单用法示例

以下例子演示用 QTimeLine 在 2 秒内把按钮从 x=0 移到 x=300:

cpp 复制代码
#include <QApplication>
#include <QPushButton>
#include <QTimeLine>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QPushButton button("Move Me");
    button.resize(100, 50);
    button.show();

    QTimeLine timeline(2000); // 动画时长 2 秒
    timeline.setFrameRange(0, 300); // 帧范围
    timeline.setCurveShape(QTimeLine::EaseInOutCurve);

    QObject::connect(&timeline, &QTimeLine::frameChanged, [&button](int frame) {
        button.move(frame, 100);
    });

    timeline.start();
    return app.exec();
}

运行

7.6 进阶用法:配合 QGraphicsItemAnimation

cpp 复制代码
#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QTimeLine>
#include <QGraphicsItemAnimation>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QGraphicsScene scene;
    QGraphicsView view(&scene);

    QGraphicsRectItem *rect = scene.addRect(0, 0, 100, 100);

    QTimeLine *timeline = new QTimeLine(2000);
    timeline->setFrameRange(0, 100);

    QGraphicsItemAnimation *animation = new QGraphicsItemAnimation;
    animation->setItem(rect);
    animation->setTimeLine(timeline);

    for (int i = 0; i <= 100; ++i) {
        animation->setRotationAt(i / 100.0, i * 3.6);
    }

    view.show();
    timeline->start();
    return app.exec();
}

7.7 优缺点与结论

  • 优点

    • 提供完整的时间管理(时长、帧数、循环等)
    • 可与 QGraphicsItemAnimation 配合,实现更精细的动画控制
  • 缺点

    • 对于现代的 Qt 属性动画或 QML 动画而言,QTimeLine 可能显得繁琐
    • 需要手动管理插值或场景更新
  • 结论

    • QTimeLine 在需要精准控制帧数或需要自定义时间逻辑的场景下依旧实用

8. QTimeLine 和 QEasingCurve 的区别

这两个类在 Qt 动画框架中分别承担不同的职责,可以相互配合使用,但并不互斥。

8.1 一、核心区别

特性 QTimeLine QEasingCurve
定义 时间轴类,用于生成动画的时间流 数学曲线类,用于定义动画的缓动插值
作用 控制动画的进度(时长、帧数、循环) 改变动画速度/插值模式(线性、弹跳、缓动等)
输出 当前时间或帧信息 根据输入进度返回相应缓动后的数值
使用场景 精准时间/帧控制 定义动画的加速、减速、弹跳等视觉效果

8.2 二、QTimeLine 详解

  • 提供动画的整体时间控制
  • 可以设置时长、帧范围、循环次数、曲线形状
  • 常用于 QGraphicsItemAnimation 等需要时间驱动的场合

8.3 三、QEasingCurve 详解

  • 定义动画的插值方式(线性、缓入缓出、弹跳等)
  • 不独立控制时间,而是根据 [0.0, 1.0] 的输入值,返回不同的插值结果
  • 通常与 QPropertyAnimationQTimeLine 配合使用

8.4 四、两者关系与配合

  • QTimeLine 生成一个随时间变化的进度值 t,范围在 [0.0, 1.0]
  • QEasingCurve 根据进度值 t 计算出缓动后的插值值
  • 典型用法:easedValue = curve.valueForProgress(t)

8.5 五、总结对比

  • QTimeLine:管理时间进度与帧信息,提供事件驱动
  • QEasingCurve:管理插值模式,使动画效果更平滑或更富表现力

它们可以结合使用,也可分别使用在不同的动画需求场景下。

9. QAbstractAnimation、QVariantAnimation 和 QPropertyAnimation 的区别

在 Qt 动画框架中,这三个类具有从抽象到具体的继承关系,主要差异在于能否直接使用以及应用场景是否针对特定属性。

9.1 一、继承关系

QAbstractAnimation
    └── QVariantAnimation
            └── QPropertyAnimation

9.2 二、核心区别

特性 QAbstractAnimation QVariantAnimation QPropertyAnimation
定义 动画框架的抽象基类 生成数值插值的动画类,继承自 QAbstractAnimation 继承自 QVariantAnimation,用于动画化 QObject 的属性
作用 定义动画的基本接口和生命周期 在动画过程中生成从起始到结束的插值数值 直接将插值结果应用到属性(如 geometry、pos 等)
是否可直接使用 否,需要子类实现 是,可直接插值 是,可直接操作属性
使用场景 自定义动画逻辑(需要自己实现插值或刷新) 需要插值数值并在动画中使用 需要直接为对象属性创建动画(UI 控件、图形项等)

9.3 三、详细分析

9.3.1.QAbstractAnimation 示例:自定义动画基类

QAbstractAnimation 是一个抽象基类,提供了基本的动画框架。通过继承它,我们可以实现自定义的动画。以下是一个简单的示例程序,创建了一个自定义动画类,使一个数字从 0 变化到 100,并在每次更新时打印值。

cpp 复制代码
#include <QCoreApplication>
#include <QAbstractAnimation>
#include <QTimer>
#include <QDebug>

class CustomAnimation : public QAbstractAnimation {
    Q_OBJECT

public:
    CustomAnimation(QObject *parent = nullptr) : QAbstractAnimation(parent), m_value(0) {}

    int duration() const override {
        return 5000; // 动画持续时间为 5 秒
    }

protected:
    // 更新动画进度
    void updateCurrentTime(int currentTime) override {
        m_value = (100 * currentTime) / duration(); // 根据当前时间计算值
        qDebug() << "Current value:" << m_value;
    }

private:
    int m_value; // 当前值
};

int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    CustomAnimation animation;
    animation.start();

    QTimer::singleShot(6000, &app, &QCoreApplication::quit); // 6秒后退出程序
    return app.exec();
}

#include "main.moc"

运行

特点

  • 用途QAbstractAnimation 是所有动画类的基类,可以通过继承它来实现完全自定义的动画逻辑。
  • 灵活性 :需要手动实现 updateCurrentTime() 和指定动画持续时间。
  • 适用场景 :当现有的 QVariantAnimationQPropertyAnimation 无法满足需求时使用。
9.3.2.QVariantAnimation 示例:插值动画

QVariantAnimation 可以在两种值之间进行插值计算(支持整数、浮点数、颜色等),并在每次值更新时发出信号。以下是一个示例程序,通过插值计算让颜色从红色渐变到蓝色。

cpp 复制代码
#include <QApplication>
#include <QVariantAnimation>
#include <QDebug>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QVariantAnimation animation;
    animation.setDuration(3000); // 动画持续时间为 3 秒
    animation.setStartValue(QColor(Qt::red)); // 起始值:红色
    animation.setEndValue(QColor(Qt::blue)); // 结束值:蓝色

    QObject::connect(&animation, &QVariantAnimation::valueChanged, [](const QVariant &value) {
        QColor color = value.value<QColor>();
        qDebug() << "Current color:" << color;
    });

    animation.start();

    QTimer::singleShot(4000, &app, &QCoreApplication::quit); // 4秒后退出程序
    return app.exec();
}

运行

特点:

  • 用途QVariantAnimation 是一个通用的插值动画类,支持多种类型(如整数、浮点数、颜色等)的值变化。
  • 插值计算 :根据动画进度自动计算中间值,并通过 valueChanged() 信号发出。
  • 适用场景:需要在两个值之间平滑过渡时使用,例如颜色渐变、大小调整等。
9.3.3.QPropertyAnimation 示例:操作对象的属性动画

QPropertyAnimation 是一个常用的动画类,用于对 QObject 的属性(如位置、大小、颜色等)进行动画处理。以下是一个示例程序,通过动画让一个矩形从左移到右。

cpp 复制代码
#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QPropertyAnimation>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建场景和矩形
    QGraphicsScene scene;
    QGraphicsRectItem *rect = scene.addRect(0, 0, 50, 50, Qt::NoPen, Qt::blue);
    rect->setPos(0, 0);

    QGraphicsView view(&scene);
    view.setFixedSize(400, 200);
    view.show();

    // 创建属性动画
    QPropertyAnimation animation(rect, "pos"); // 动画作用于矩形的 "pos" 属性
    animation.setDuration(2000); // 动画持续时间为 2 秒
    animation.setStartValue(QPointF(0, 0)); // 起始位置
    animation.setEndValue(QPointF(300, 0)); // 结束位置
    animation.setEasingCurve(QEasingCurve::InOutQuad); // 平滑效果

    animation.start();

    return app.exec();
}

运行

特点:

  • 用途QPropertyAnimation 是专门设计用于操作 QObject 的属性的动画类。
  • 自动绑定属性 :通过指定属性名称(如 "pos""size" 等),直接修改对象的属性值。
  • 适用场景:对象的移动、缩放、透明度变化等动画效果。
9.3.4.区别总结
动画类 主要特点 适用场景
QAbstractAnimation 抽象基类,允许完全自定义动画逻辑 特殊需求,现有动画类无法满足时使用
QVariantAnimation 通用插值动画类,支持多种类型(如整数、浮点数、颜色等)的值变化,提供 valueChanged 信号 数值渐变(如颜色渐变、大小调整等)
QPropertyAnimation 操作 QObject 的属性动画,直接绑定属性名称(如 "pos""size"),支持平滑插值和缓动曲线 对象的移动、缩放、透明度变化等动画效果

9.4 四、对比总结

  • QAbstractAnimation:框架层面的基类,提供动画生命周期管理
  • QVariantAnimation:可插值任何数值,适合自定义数值动画
  • QPropertyAnimation:最常用,直接作用于对象属性,易于上手

根据需求选择合适的类:若只是要动画化控件的属性,用 QPropertyAnimation;若需要自定义插值逻辑,可用 QVariantAnimation;若需要从更底层控制动画流程,可以继承 QAbstractAnimation

通过上述内容,应该对 Qt 动画的整体框架和常用类有了比较系统的认识。可以先从最简单的 QPropertyAnimation 入手,为按钮或窗口做移动、大小、透明度的动画,再逐步尝试组合动画(顺序或并行),最后再根据需要,学习并使用 QTimeLineQEasingCurve 等更高级或更灵活的功能。

相关推荐
Spcarrydoinb3 分钟前
python学习笔记—15—数据容器之列表
笔记·python·学习
油焖茄子5 分钟前
flutter 独立开发之笔记
笔记·flutter
zhangzhangkeji6 分钟前
c/c++ 里的进程间通信 , 管道 pipe 编程举例
c语言·c++
nuise_9 分钟前
李宏毅机器学习课程笔记02 | 机器学习任务攻略General Guide
人工智能·笔记·机器学习
小wanga12 分钟前
【C++】特殊类设计
android·c++
ℒฺℴฺνℯ̶ฺ归̶零̶⋆31829 分钟前
0107作业
c++
vv啊vv31 分钟前
ROS笔记
笔记
无限码力1 小时前
目标值子矩阵的数量
c++·算法·矩阵
Stanford_11061 小时前
关于物联网的基础知识(三)——物联网技术架构:连接万物的智慧之道!连接未来的万物之网!
c++·物联网·学习·微信小程序·架构·twitter·微信开放平台
java亮小白19971 小时前
【高项】信息系统项目管理师(三)项目立项管理
经验分享·笔记·学习方法