Qt 窗口动画效果设计(QPropertyAnimation、QSequentialAnimationGroup、QParallelAnimationGroup)

一、QPropertyAnimation

QPropertyAnimation是Qt框架中的一个类,它专门用于实现对象属性的动画处理。通过QPropertyAnimation,可以创建平滑、连续的动画效果,如控件的位置、大小、颜色等属性的变化。

构造函数

QPropertyAnimation类提供了两个主要的构造函数:

1、QPropertyAnimation(QObject *target, const QByteArray &propertyName, QObject *parent = nullptr)

  • target:指向一个QObject或其子类的对象指针,即动画所作用的目标对象。
  • propertyName:一个QByteArray类型变量,包含了要被动画化的属性名称。
  • parent:可选参数,指向QObject的一个父对象,用于构成Qt的父对象-子对象层次结构。


2、QPropertyAnimation(QObject *parent = nullptr)

  • 这个构造函数创建了一个不直接关联目标对象和属性名的动画实例。之后需要通过调用setTargetObject()和setPropertyName()方法来分别设置目标对象和属性名。

成员函数

1、设置动画值

  • setStartValue(const QVariant &value):设置动画的起始值。
  • setEndValue(const QVariant &value):设置动画的结束值。

2、设置动画时长和曲线

  • setDuration(int msecs):设置动画的持续时间(以毫秒为单位)。
  • setEasingCurve(const QEasingCurve &easing):设置动画的缓动曲线,Qt提供了多种缓动函数,如线性、加速、减速等。

3、控制动画播放

  • start():开始播放动画。
  • stop():停止动画。

4、获取动画状态

  • state():返回动画的当前状态,如运行状态、停止状态等。

5、其他设置

  • setDirection(QAbstractAnimation::Direction direction):设置动画的播放方向(正向或反向)。
  • setLoopCount(int loopCount):设置动画的循环播放次数,设置为-1表示无限循环。
//窗口移动+动画曲线效果
QPushButton *button = new QPushButton("Click me", nullptr);
button->setGeometry(400, 150, 200, 300);
button->show();


QPropertyAnimation *animation = new QPropertyAnimation(button, "pos");
animation->setDuration(3000); // 设置动画持续时间为1秒
animation->setStartValue(QPoint(400, 150)); // 设置起始位置
animation->setEndValue(QPoint(800, 150)); // 设置结束位置

animation->setEasingCurve(QEasingCurve::OutBounce); //设置动画曲线

QObject::connect(button, &QPushButton::clicked, qApp, [&, animation]
{
	animation->start(); // 开始动画
});

二、QSequentialAnimationGroup 

QSequentialAnimationGroup 是Qt动画框架中的一个重要类,它用于创建一个串行运行的动画组。在这个动画组中,多个动画将按照被添加到组中的顺序依次执行,即一个动画完成后,下一个动画才会开始。这种机制使得开发者能够轻松地创建复杂的动画序列,而无需手动管理动画之间的时间同步问题。

主要特点

  1. 顺序执行:QSequentialAnimationGroup按照动画被添加到组中的顺序来播放这些动画。这确保了动画之间的时间顺序和连续性。

  2. 动画管理:它提供了addAnimation()insertAnimation()方法来添加动画到组中,以及removeAnimation()clear()方法来从组中移除动画。此外,还提供了animations()方法来获取组中的所有动画。

  3. 暂停和循环:通过addPause()insertPause()方法,可以在动画之间添加暂停。同时,setLoopCount()方法允许设置动画组的循环次数,从而可以重复播放整个动画序列。

  4. 动画状态:在任何时刻,动画组中最多只有一个动画是活动的。可以通过currentAnimation()方法获取当前正在播放的动画。

QPushButton *button = new QPushButton("Click me", nullptr);
button->setGeometry(400, 150, 200, 300);
button->show();

// 创建两个动画对象
QPropertyAnimation *fadeIn = new QPropertyAnimation(button, "windowOpacity");
fadeIn->setDuration(3000);
fadeIn->setStartValue(0);
fadeIn->setEndValue(1);

QPropertyAnimation *move = new QPropertyAnimation(button, "geometry");
move->setDuration(3000);
move->setStartValue(QRect(400, 150, 200, 300));
move->setEndValue(QRect(800, 150, 200, 300));

// 创建顺序动画组
QSequentialAnimationGroup *group = new QSequentialAnimationGroup();
group->addAnimation(fadeIn);
group->addAnimation(move);

QObject::connect(button, &QPushButton::clicked, qApp, [&, group]
{
	group->start(); // 开始动画
});

三、QParallelAnimationGroup 

QParallelAnimationGroup 是Qt动画框架中的一个类,它允许开发者将多个动画并行执行,即这些动画将同时开始并运行,而不是像QSequentialAnimationGroup那样按顺序执行。这种并行执行的特性使得QParallelAnimationGroup非常适合用于创建复杂的、需要多个动画同时进行的场景。

主要特点

  1. 并行执行:所有添加到QParallelAnimationGroup中的动画都将同时启动,并在同一时间段内运行。这使得动画之间的时间同步变得非常简单,无需手动控制。

  2. 动画管理:与QSequentialAnimationGroup类似,QParallelAnimationGroup也提供了addAnimation()等方法来添加动画到组中,以及removeAnimation()等方法来移除动画。但不同的是,这些动画将并行执行而不是顺序执行。

  3. 动画完成:QParallelAnimationGroup的完成时间取决于其内部持续时间最长的动画。只有当所有动画都完成后,动画组才会标记为完成。

  4. 灵活性和扩展性:QParallelAnimationGroup可以被视为任何其他QAbstractAnimation对象,因此它可以被暂停、重置、添加到其他动画组中,或者与其他动画和动画组结合使用,以实现更复杂的动画效果。

QPushButton *button = new QPushButton("Click me", nullptr);
button->setGeometry(400, 150, 200, 300);
button->show();

// 创建两个动画对象
QPropertyAnimation *fadeIn = new QPropertyAnimation(button, "windowOpacity");
fadeIn->setDuration(3000);
fadeIn->setStartValue(0);
fadeIn->setEndValue(1);

QPropertyAnimation *move = new QPropertyAnimation(button, "geometry");
move->setDuration(3000);
move->setStartValue(QRect(400, 150, 200, 300));
move->setEndValue(QRect(800, 150, 200, 300));

// 创建并行动画组
QParallelAnimationGroup *group = new QParallelAnimationGroup();
group->addAnimation(fadeIn);
group->addAnimation(move);

QObject::connect(button, &QPushButton::clicked, qApp, [&, group]
{
	group->start(); // 开始动画
});

qq群交流:698593923

觉得有帮助的话,打赏一下呗。。

           

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值