PySide超入門【第21回 | 応用編】QPropertyAnimationで簡単GUIアニメーションの作り方解説

\ 迷ったらまずTechAcademyの無料カウンセリング! /

GUIアプリケーションの操作性や見た目を向上させるために、アニメーションは非常に有効な手段です。PySide(Qt)では、QPropertyAnimation クラスを使ってウィジェットのプロパティを時間をかけて滑らかに変化させることができます。

本記事では、QPropertyAnimation基本的な使い方から、主なプロパティやメソッドの解説、よくある質問まで詳しく解説していきます。
これをマスターすれば、ボタンの移動やフェードイン・アウト、サイズ変更など、多彩なアニメーションを簡単に実装できるようになります。

目次

QPropertyAnimationとは?

QPropertyAnimation は、対象オブジェクトの指定したプロパティの値を、開始値から終了値まで時間をかけて変化させるアニメーションを実現するクラスです。
主にGUI部品の移動、サイズ変更、色の変更などに使われます。

基本コード

from PySide6.QtWidgets import QApplication, QWidget, QPushButton
from PySide6.QtCore import QPropertyAnimation, QRect
import sys

app = QApplication(sys.argv)

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QPropertyAnimationの例")
        self.resize(400, 300)

        self.button = QPushButton("動くボタン", self)
        self.button.setGeometry(50, 50, 100, 40)

        # アニメーション設定
        self.anim = QPropertyAnimation(self.button, b"geometry")
        self.anim.setDuration(1000)  # 1秒
        self.anim.setStartValue(QRect(50, 50, 100, 40))
        self.anim.setEndValue(QRect(250, 200, 100, 40))
        self.anim.start()

window = Window()
window.show()
sys.exit(app.exec())

主なプロパティとメソッド一覧(全解説)

Noメソッド / プロパティ説明
1setTargetObject(obj)アニメーションの対象となるオブジェクトを設定anim.setTargetObject(button)
2setPropertyName(name)アニメーションするプロパティ名を設定anim.setPropertyName(b”geometry”)
3setDuration(msec)アニメーションの時間(ミリ秒)を設定anim.setDuration(1000)
4setStartValue(value)アニメーションの開始値を設定anim.setStartValue(QRect(0, 0, 100, 30))
5setEndValue(value)アニメーションの終了値を設定anim.setEndValue(QRect(200, 200, 100, 30))
6setEasingCurve(curve)アニメーションの進行曲線(イージング)を設定anim.setEasingCurve(QEasingCurve.OutBounce)
7start()アニメーションを開始するanim.start()
8pause()アニメーションを一時停止するanim.pause()
9resume()一時停止したアニメーションを再開するanim.resume()
10stop()アニメーションを停止するanim.stop()
11state()アニメーションの状態を取得(Stopped, Running, Paused)state = anim.state()
12currentTime()現在のアニメーション経過時間を取得t = anim.currentTime()
13loopCount()アニメーションのループ回数を取得count = anim.loopCount()
14setLoopCount(count)アニメーションのループ回数を設定(0は無限ループ)anim.setLoopCount(3)
15direction()アニメーションの方向(Forward, Backward)を取得d = anim.direction()
16setDirection(direction)アニメーションの方向を設定anim.setDirection(QAbstractAnimation.Backward)

各プロパティ・メソッド 詳細解説

【1】アニメーションの対象を設定

概要:アニメーションをかけたいオブジェクトを設定します。
メソッド:setTargetObject(obj)
使い方:

self.anim.setTargetObject(self.button)

【2】アニメーションさせるプロパティ名を設定

概要:アニメーションで変化させるオブジェクトのプロパティ名を指定します。QPropertyAnimation で指定できるのは、Qt のオブジェクトが Q_PROPERTY として公開しているプロパティ名だけです。
メソッド:setPropertyName(bytes)
使い方:

self.anim.setPropertyName(b"geometry")
プロパティ名説明
geometryQRect位置とサイズ(x, y, 幅, 高さ)
posQPoint位置(x, y)だけ
sizeQSizeサイズ(幅, 高さ)だけ
windowOpacityfloatウィンドウの不透明度(0.0~1.0)
colorQColor色(背景や塗りつぶしなど)
maximumWidthint最大幅
minimumHeightint最小高さ

【3】開始値を設定

概要:アニメーション開始時のプロパティの値を設定します。
引数:アニメーション対象プロパティに応じた型(例:int, float, QColor, QRect など)
メソッド:setStartValue(value)
使い方:QRect(x, y, width, height)

self.anim.setStartValue(QRect(0, 0, 100, 30))
  • geometry(位置とサイズ) → QRect
  • pos(位置だけ) → QPoint
  • size(サイズだけ) → QSize
  • windowOpacity(透明度) → float

【4】終了値を設定

概要:アニメーション終了時のプロパティの値を設定します。
引数:アニメーション対象プロパティに応じた型(例:int, float, QColor, QRect など)
メソッド:setEndValue(value)
使い方:QRect(x, y, width, height)

self.anim.setEndValue(QRect(250, 250, 100, 30))
  • geometry(位置とサイズ) → QRect
  • pos(位置だけ) → QPoint
  • size(サイズだけ) → QSize
  • windowOpacity(透明度) → float

【5】アニメーションの継続時間を設定

概要:アニメーションが完了するまでの時間(ミリ秒)を設定します。
メソッド:setDuration(int)
使い方:

self.setDuration(5000)  # 5秒

【6】アニメーションのイージング曲線を設定

概要:アニメーションの進み方(速度カーブ)を設定します。例えば 線形、加速、減速、弾む、跳ねる、弾性のように伸び縮みする などです。
メソッド:setEasingCurve(QEasingCurve)
使い方:

from PySide6.QtCore import QEasingCurve
self.anim.setEasingCurve(QEasingCurve.OutBounce)
種類定数名説明動きの特徴
直線Linear開始から終了まで一定速度均一に動く
二次加速InQuad最初はゆっくり、だんだん速くなる加速する動き
二次減速OutQuad最初は速く、だんだんゆっくり止まる減速する動き
二次加速+減速InOutQuad最初はゆっくり、中盤速く、最後はまたゆっくり自然な加速減速
三次加速InCubicより急に加速するぐんっと勢いがつく
三次減速OutCubic急に減速して止まる急ブレーキっぽい
三次加速+減速InOutCubic両方組み合わせ滑らかで自然
弾むように止まるOutBounce終点でバウンドするボールが床に落ちる感じ
弾むように始まるInBounce始点でバウンドしてから動き出す逆再生みたいなバウンド
弾む両方InOutBounce開始と終了でバウンドコミカルな動き
弾性(始めに伸びる)InElasticゴムが引っ張られて伸びるように動くビヨーンと始まる
弾性(終わりに伸びる)OutElasticゴムのように揺れて止まるビヨヨンと止まる
弾性(両方)InOutElastic始めも終わりも弾むド派手に揺れる
円弧的InCirc円のように加速ゆっくり始まり急加速
指数関数的OutExpo急加速して最後に急減速ドラマチック
サイン波InOutSineサインカーブのように滑らか波のような自然な動き

【7】アニメーションの開始

概要:設定したアニメーションを開始します。
メソッド:start()
使い方:

self.anim.start()

【8】アニメーションの停止

概要:実行中のアニメーションを停止します。
メソッド:stop()
使い方:

self.anim.stop()

【9】アニメーションのループ回数を設定

概要:アニメーションを繰り返す回数を設定します。-1で無限ループになります。
メソッド:setLoopCount(int)
使い方:

self.anim.setLoopCount(3)  # 3回繰り返す

【10】アニメーションの現在の進行状況を取得

概要:アニメーションの現在の進行度(0〜1)を取得します。
メソッド:currentTime()
使い方:

time = self.anim.currentTime()
print(time)
# 0

【11】アニメーションの状態を取得

概要:アニメーションが動いているか停止しているかを取得します。
メソッド:state()
使い方:

from PySide6.QtCore import QAbstractAnimation
if self.anim.state() == QAbstractAnimation.Running:
    print("動作中")

# 動作中

【12】アニメーションの一時停止

概要:実行中のアニメーションを一時停止します。
メソッド:pause()
使い方:

self.anim.pause()

【13】アニメーションの再開

概要:一時停止したアニメーションを再開します。
メソッド:resume()
使い方:

self.anim.resume()

【14】アニメーションの進行方向を設定

概要:アニメーションの再生方向を設定します(順再生・逆再生)。
メソッド:setDirection(QAbstractAnimation.Direction)
使い方:

from PySide6.QtCore import QAbstractAnimation
self.anim.setDirection(QAbstractAnimation.Backward)

【15】アニメーションの進行方向を取得

概要:現在のアニメーションの方向を取得します。
メソッド:direction()
使い方:

dir = self.anim.direction()
print(dir)
# Direction.Backward

【16】アニメーション終了時のシグナル

概要:アニメーションが終了したときに発行されるシグナルです。
シグナル:finished
使い方:

def __init__(self):
    self.anim.finished.connect(self.on_animation_finished)

def on_animation_finished(self):
    print("アニメーションが終了しました!")

# アニメーションが終了しました

よくある質問(FAQ)

QPropertyAnimationはどんなプロパティに使えますか?

Qtのオブジェクトで、プロパティとして登録されているものに使えます。例えば、geometry(位置・サイズ)、pos(位置)、size(サイズ)、windowOpacity(透明度)などです。

アニメーションの速度を変えたいときは?

setDuration() で時間を調整できます。短くすると速く、長くするとゆっくり動きます。

アニメーションの進み方(曲線)を変更できますか?

はい、setEasingCurve()QEasingCurve の各種プリセットを設定できます。例えば、OutBounceInOutQuad などがあります。

アニメーションを途中で止めることはできますか?

stop() メソッドでアニメーションを停止できます。

複数のアニメーションを連続で実行したい場合は?

QSequentialAnimationGroup を使うと複数の QPropertyAnimation を順番に実行できます。

まとめ

本記事では、PySide6のQPropertyAnimationを使ったGUIアニメーションの基本から応用までを解説しました。プロパティの設定や動作のカスタマイズ方法を理解することで、より魅力的で動きのあるインターフェースを実装できるようになります。

次回は、GUIの時間制御や繰り返し処理で欠かせないQTimerについて詳しく解説します。タイマーを使ったイベント発火の仕組みや実践的な活用例を紹介しますので、ぜひご期待ください!

シェアしてくださると嬉しいです!
  • URLをコピーしました!

コメント

コメントする

目次