一、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动画框架中的一个重要类,它用于创建一个串行运行的动画组。在这个动画组中,多个动画将按照被添加到组中的顺序依次执行,即一个动画完成后,下一个动画才会开始。这种机制使得开发者能够轻松地创建复杂的动画序列,而无需手动管理动画之间的时间同步问题。
主要特点
-
顺序执行:QSequentialAnimationGroup按照动画被添加到组中的顺序来播放这些动画。这确保了动画之间的时间顺序和连续性。
-
动画管理:它提供了
addAnimation()
和insertAnimation()
方法来添加动画到组中,以及removeAnimation()
和clear()
方法来从组中移除动画。此外,还提供了animations()
方法来获取组中的所有动画。 -
暂停和循环:通过
addPause()
或insertPause()
方法,可以在动画之间添加暂停。同时,setLoopCount()
方法允许设置动画组的循环次数,从而可以重复播放整个动画序列。 -
动画状态:在任何时刻,动画组中最多只有一个动画是活动的。可以通过
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非常适合用于创建复杂的、需要多个动画同时进行的场景。
主要特点
-
并行执行:所有添加到QParallelAnimationGroup中的动画都将同时启动,并在同一时间段内运行。这使得动画之间的时间同步变得非常简单,无需手动控制。
-
动画管理:与QSequentialAnimationGroup类似,QParallelAnimationGroup也提供了
addAnimation()
等方法来添加动画到组中,以及removeAnimation()
等方法来移除动画。但不同的是,这些动画将并行执行而不是顺序执行。 -
动画完成:QParallelAnimationGroup的完成时间取决于其内部持续时间最长的动画。只有当所有动画都完成后,动画组才会标记为完成。
-
灵活性和扩展性: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
觉得有帮助的话,打赏一下呗。。