Qt動畫組

Qt中的動畫組是由QAnimationGroup抽象類來表示的。一個動畫組是一個動畫的容器。動畫組一般負責管理它的動畫的狀態,也就是說由它決定,什麼時候開始動畫,什麼時候停止動畫,什麼時候暫停動畫,什麼時候重新運行動畫。目前,Qt中提供了兩種動畫組:並行動畫組合串行動畫組。

另外,根據Qt幫助文檔可知,動畫組和動畫均繼承自QAbstractAnimation,所以,你也可以組合動畫組,來構建複雜的動畫。但不支持直接啓動子動畫組,這會導致不可預知的行爲。QAnimationGroup提供了添加和獲取動畫的方法。除此之外,可以使用removeAnimation()來刪除動畫,使用clear()函數來清空動畫組中的動畫。還可以通過監聽QEvent::ChildAdded 和 QEvent::ChildRemoved 事件來跟蹤動畫組中動畫的變化。

QAnimationGroup 會獲取它所管理的動畫的所有權,並確保在刪除動畫組時也刪除它們。

下面,我們以屬性動畫爲例,來看一看這兩種動畫組的使用方式。

新建一個GUI程序,往窗口中拖入兩個按鈕,稍後我們使用動畫來改變這兩個按鈕的尺寸。再拖入兩個按鈕,一個用來啓動並行動畫,一個用來啓動串行動畫。

界面如下圖:



並行動畫按鈕的槽函數,代碼如下:

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秒的作用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章