QPropertyAnimationを使ったウィジェットのアニメ表示

ウィジェットをフェードアウトやフェードインさせたり、色を変化させるなどしてアニメ効果をつけたい場合はQPropertyAnimationを使います。

このクラスでアニメーション可能なのは色や透過色、ウィジェットの位置や大きさなどです。

例えばあるラベルをフェードインさせながら画面に表示させたい場合、次のようなコードが書けます。

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    QGraphicsOpacityEffect* opacityEffect = new QGraphicsOpacityEffect(ui->label);
    ui->label->setGraphicsEffect(opacityEffect);
        /// ラベルにエフェクトを設定
    
    /** 透過アニメーションの設定と開始 */
    QPropertyAnimation * anim = new QPropertyAnimation(this, "opacity");
    anim->setTargetObject(opacityEffect);
    anim->setStartValue(0.0);
    anim->setEndValue(1.0);
    anim->setDuration(5000);
    anim->start(QAbstractAnimation::DeleteWhenStopped);
}

ウィジェットに透過効果を持たせるにはQGraphicsEffectを使うので初めにそれをウィジェットに設定します。

その後、QPropertyAnimationsetTargetObjectで透過効果を設定し、初めと終わりの透過を設定してからフェードインアニメを開始しています。ちなみにsetValueで設定できる透過色の範囲は0.0から1.0の間です。

アニメーション中では下の画像のようにテキストだけでなく、ウィジェット全体に透過色が指定されます。

透過アニメーション中のラベル

高度なアニメーションの方法

先ほど紹介した例では始まりと終わりの2点しか透過色を設定していませんでしたがsetKeyValuAtを使えば任意の場所でアニメーションの切り替えができます。

それが次のコードです。

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    QGraphicsOpacityEffect* opacityEffect = new QGraphicsOpacityEffect(ui->label);
    ui->label->setGraphicsEffect(opacityEffect);
        /// ラベルにエフェクトを設定
    
    /** 透過アニメーションの設定と開始*/
    QPropertyAnimation * anim = new QPropertyAnimation(this, "opacity");
    anim->setTargetObject(opacityEffect);
    anim->setKeyValueAt(0.0, 1.0);
    anim->setKeyValueAt(0.5, 0.0);
    anim->setKeyValueAt(1.0, 1.0);
    anim->setDuration(5000);
    anim->start(QAbstractAnimation::DeleteWhenStopped);
}

setKeyValueAtでは全体を1とみなして0.0から1.0の範囲内で任意の時間のプロパティを変えることができます。

この例では5秒間のうち、前半の2.5秒でフェードアウトして、後半の2.5秒でフェードインしています。

ここでは透過アニメーションについて紹介しましたが、そのほかのプロパティ(位置や色)でもアニメーションは可能です。

以上がウィジェットへのアニメーションの設定方法です。お疲れ様でした!

関連項目
プライバシーポリシー