Qt动画组

Qt中的动画组是由QAnimationGroup抽象类来表示的。一个动画组是一个动画的容器。动画组一般负责管理它的动画的状态,也就是说由它决定,什么时候开始动画,什么时候停止动画,什么时候暂停动画,什么时候重新运行动画。目前,Qt中提供了两种动画组:并行动画组合串行动画组。

另外,根据Qt帮助文档可知,动画组和动画均继承自QAbstractAnimation,所以,你也可以组合动画组,来构建复杂的动画。但不支持直接启动子动画组,这会导致不可预知的行为。QAnimationGroup提供了添加和获取动画的方法。除此之外,可以使用removeAnimation()来删除动画,使用clear()函数来清空动画组中的动画。还可以通过监听QEvent::ChildAdded 和 QEvent::ChildRemoved 事件来跟踪动画组中动画的变化。

QAnimationGroup 会获取它所管理的动画的所有权,并确保在删除动画组时也删除它们。

下面,我们以属性动画为例,来看一看这两种动画组的使用方式。

新建一个GUI程序,往窗口中拖入两个按钮,稍后我们使用动画来改变这两个按钮的尺寸。再拖入两个按钮,一个用来启动并行动画,一个用来启动串行动画。

界面如下图:

Qt动画组_第1张图片


并行动画按钮的槽函数,代码如下:

void Widget::on_parallelBtn_clicked()
{
    QPropertyAnimation *animation1 = new QPropertyAnimation(ui->targetButton1, "size");
    animation1->setDuration(5000);
    animation1->setStartValue(QSize(50, 50));
    animation1->setEndValue(QSize(150, 150));

    QPropertyAnimation *animation2 = new QPropertyAnimation(ui->targetButton2, "size");
    animation2->setDuration(5000);
    animation2->setStartValue(QSize(50, 50));
    animation2->setEndValue(QSize(100, 100));

    QParallelAnimationGroup *paraGroup = new QParallelAnimationGroup(this);
    paraGroup->addAnimation(animation1);
    paraGroup->addAnimation(animation2);
    paraGroup->start();
}

当点击并行按钮时,会看到两个targetButton的尺寸同时变化。

串行动画也类似,代码如下:

void Widget::on_sequentialBtn_clicked()
{
    QPropertyAnimation *animation1 = new QPropertyAnimation(ui->targetButton1, "size");
    animation1->setDuration(5000);
    animation1->setStartValue(QSize(50, 50));
    animation1->setEndValue(QSize(150, 150));

    QPropertyAnimation *animation2 = new QPropertyAnimation(ui->targetButton2, "size");
    animation2->setDuration(5000);
    animation2->setStartValue(QSize(50, 50));
    animation2->setEndValue(QSize(100, 100));

    QSequentialAnimationGroup *sequGroup = new QSequentialAnimationGroup(this);
    sequGroup->addAnimation(animation1);
    //sequGroup->addPause(3000);
    sequGroup->addAnimation(animation2);
    sequGroup->start();
}
当点击串行动画按钮时,两个动画将按照添加的先后顺序依次执行,即第一个targetButton的尺寸先变化,然后是第二个按钮的尺寸发生变化。

注意,上面注释的那句代码。该句代码可以给串行动画组添加一个暂停。如果把注释去掉,可以看到第一个动画运行结束后,3秒后才开始运行第二个动画,暂停了3秒。其实这是一个向串行动画中插入一个暂停动画的简便方法。而暂停动画由QPauseAnimation类来表示,所以,我们也可以先定义一个该类的实例,然后使用addAnimation()函数将它加入到串行动画组中。代码如下:

    QPauseAnimation *pause = new QPauseAnimation;
    pause->setDuration(3000);
    sequGroup->addAnimation(pause);
用上面的代码替换注释掉的那句,也可以达到将串行动画暂停3秒的作用。

你可能感兴趣的