\ 迷ったらまずTechAcademyの無料カウンセリング! /
PySide超入門【第21回 | 応用編】QPropertyAnimationで簡単GUIアニメーションの作り方解説

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 | メソッド / プロパティ | 説明 | 例 |
---|---|---|---|
1 | setTargetObject(obj) | アニメーションの対象となるオブジェクトを設定 | anim.setTargetObject(button) |
2 | setPropertyName(name) | アニメーションするプロパティ名を設定 | anim.setPropertyName(b”geometry”) |
3 | setDuration(msec) | アニメーションの時間(ミリ秒)を設定 | anim.setDuration(1000) |
4 | setStartValue(value) | アニメーションの開始値を設定 | anim.setStartValue(QRect(0, 0, 100, 30)) |
5 | setEndValue(value) | アニメーションの終了値を設定 | anim.setEndValue(QRect(200, 200, 100, 30)) |
6 | setEasingCurve(curve) | アニメーションの進行曲線(イージング)を設定 | anim.setEasingCurve(QEasingCurve.OutBounce) |
7 | start() | アニメーションを開始する | anim.start() |
8 | pause() | アニメーションを一時停止する | anim.pause() |
9 | resume() | 一時停止したアニメーションを再開する | anim.resume() |
10 | stop() | アニメーションを停止する | anim.stop() |
11 | state() | アニメーションの状態を取得(Stopped, Running, Paused) | state = anim.state() |
12 | currentTime() | 現在のアニメーション経過時間を取得 | t = anim.currentTime() |
13 | loopCount() | アニメーションのループ回数を取得 | count = anim.loopCount() |
14 | setLoopCount(count) | アニメーションのループ回数を設定(0は無限ループ) | anim.setLoopCount(3) |
15 | direction() | アニメーションの方向(Forward, Backward)を取得 | d = anim.direction() |
16 | setDirection(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")
プロパティ名 | 型 | 説明 |
---|---|---|
geometry | QRect | 位置とサイズ(x, y, 幅, 高さ) |
pos | QPoint | 位置(x, y)だけ |
size | QSize | サイズ(幅, 高さ)だけ |
windowOpacity | float | ウィンドウの不透明度(0.0~1.0) |
color | QColor | 色(背景や塗りつぶしなど) |
maximumWidth | int | 最大幅 |
minimumHeight | int | 最小高さ |
【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
の各種プリセットを設定できます。例えば、OutBounce
やInOutQuad
などがあります。 - アニメーションを途中で止めることはできますか?
-
stop()
メソッドでアニメーションを停止できます。 - 複数のアニメーションを連続で実行したい場合は?
-
QSequentialAnimationGroup
を使うと複数のQPropertyAnimation
を順番に実行できます。
まとめ
本記事では、PySide6のQPropertyAnimation
を使ったGUIアニメーションの基本から応用までを解説しました。プロパティの設定や動作のカスタマイズ方法を理解することで、より魅力的で動きのあるインターフェースを実装できるようになります。
次回は、GUIの時間制御や繰り返し処理で欠かせないQTimer
について詳しく解説します。タイマーを使ったイベント発火の仕組みや実践的な活用例を紹介しますので、ぜひご期待ください!

コメント