PyQt개발강좌, QSequentialAnimationGroup과 QParallelAnimationGroup

작성자: 조광형

작성일: 2024년 11월 26일

서론

PyQt는 Python에서 Qt 애플리케이션 개발을 가능하게 하는 가장 인기 있는 라이브러리 중 하나입니다. PyQt를 활용하면 복잡한 GUI 애플리케이션을 효율적으로 제작할 수 있습니다.
그 중에서도 애니메이션은 사용자 인터페이스를 보다 직관적이고 매력적으로 만드는 중요한 요소입니다.
QSequentialAnimationGroup과 QParallelAnimationGroup은 PyQt에서 애니메이션을 효과적으로 관리하기 위한 두 가지 중요한 클래스로, 이러한 애니메이션의 흐름과 동기화를 제어할 수 있습니다.

1. 기본 개념

QSequentialAnimationGroup과 QParallelAnimationGroup은 Qt의 애니메이션 프레임워크에 포함된 클래스입니다.
이들 클래스는 각각 애니메이션을 순차적 또는 병렬적으로 실행할 수 있는 기능을 제공합니다.
이를 통해 사용자 인터페이스의 다양한 요소를 부드럽고 직관적으로 조작할 수 있습니다.

1.1 QSequentialAnimationGroup

QSequentialAnimationGroup은 여러 애니메이션을 순차적으로 실행할 수 있는 그룹을 형성합니다.
첫 번째 애니메이션이 끝난 후 두 번째 애니메이션이 시작하는 식으로, 쉽게 복잡한 애니메이션 효과를 만들어낼 수 있습니다.
이 장치는 예를 들어 버튼 클릭 시 여러 효과를 연달아 보여주고자 할 때 유용하게 사용할 수 있습니다.

1.2 QParallelAnimationGroup

QParallelAnimationGroup은 여러 애니메이션을 동시에 실행할 수 있는 그룹입니다.
이 방식은 화면에서 여러 요소를 동시에 약간의 시간 차이로 애니메이션 효과를 주고자 할 때 유용합니다.
예를 들어, 사용자 인터페이스의 여러 요소를 동시에 강조하고자 할 때 활용됩니다.

2. QSequentialAnimationGroup 예제

이 예제에서는 QSequentialAnimationGroup을 사용하여 버튼 클릭 시 위아래로 움직이는 애니메이션을 생성합니다.

2.1 예제 코드


import sys
from PyQt5.QtWidgets import QApplication, QPushButton, QWidget, QVBoxLayout
from PyQt5.QtCore import QPropertyAnimation, QPoint, QSequentialAnimationGroup

class AnimationExample(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(100, 100, 300, 200)
        self.setWindowTitle('QSequentialAnimationGroup 예제')

        self.button = QPushButton('애니메이션 시작', self)
        self.button.clicked.connect(self.startAnimation)

        layout = QVBoxLayout()
        layout.addWidget(self.button)
        self.setLayout(layout)

    def startAnimation(self):
        # 애니메이션 그룹 생성
        animation_group = QSequentialAnimationGroup(self)

        # 첫 번째 애니메이션: 위로 이동
        move_up = QPropertyAnimation(self.button, b"pos")
        move_up.setEndValue(QPoint(100, 50))
        move_up.setDuration(1000)

        # 두 번째 애니메이션: 아래로 이동
        move_down = QPropertyAnimation(self.button, b"pos")
        move_down.setEndValue(QPoint(100, 150))
        move_down.setDuration(1000)

        # 애니메이션 그룹에 애니메이션 추가
        animation_group.addAnimation(move_up)
        animation_group.addAnimation(move_down)

        # 애니메이션 시작
        animation_group.start()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = AnimationExample()
    ex.show()
    sys.exit(app.exec_())
            

2.2 코드 설명

위 코드는 버튼을 클릭했을 때 QSequentialAnimationGroup을 이용하여 버튼이 위로 이동한 후 다시 아래로 내려오는 애니메이션을 생성하는 예입니다.
QPropertyAnimation을 사용하여 버튼의 위치를 애니메이션하며,
QPoint으로 애니메이션의 시작과 끝 위치를 정의합니다.
각각의 애니메이션은 지속 시간(setDuration)을 설정하고,
이를 QSequentialAnimationGroup에 추가하여 순차적으로 실행합니다.

3. QParallelAnimationGroup 예제

이 예제에서는 QParallelAnimationGroup을 사용하여 두 개의 버튼을 동시에 좌우로 이동시키는 애니메이션을 생성합니다.

3.1 예제 코드


import sys
from PyQt5.QtWidgets import QApplication, QPushButton, QWidget, QVBoxLayout
from PyQt5.QtCore import QPropertyAnimation, QPoint, QParallelAnimationGroup

class ParallelAnimationExample(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(100, 100, 300, 200)
        self.setWindowTitle('QParallelAnimationGroup 예제')

        self.button1 = QPushButton('버튼 1', self)
        self.button2 = QPushButton('버튼 2', self)

        layout = QVBoxLayout()
        layout.addWidget(self.button1)
        layout.addWidget(self.button2)
        self.setLayout(layout)

        self.button1.clicked.connect(self.startAnimation)

    def startAnimation(self):
        # 애니메이션 그룹 생성
        animation_group = QParallelAnimationGroup(self)

        # 첫 번째 애니메이션: 버튼 1을 오른쪽으로 이동
        move_right_button1 = QPropertyAnimation(self.button1, b"pos")
        move_right_button1.setEndValue(QPoint(150, 0))
        move_right_button1.setDuration(1000)

        # 두 번째 애니메이션: 버튼 2를 왼쪽으로 이동
        move_left_button2 = QPropertyAnimation(self.button2, b"pos")
        move_left_button2.setEndValue(QPoint(0, 0))
        move_left_button2.setDuration(1000)

        # 애니메이션 그룹에 애니메이션 추가
        animation_group.addAnimation(move_right_button1)
        animation_group.addAnimation(move_left_button2)

        # 애니메이션 시작
        animation_group.start()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = ParallelAnimationExample()
    ex.show()
    sys.exit(app.exec_())
            

3.2 코드 설명

위 코드는 버튼 1을 오른쪽으로 이동시키고 버튼 2를 왼쪽으로 이동시키는 애니메이션을 동시에 실행하는 예입니다.
QParallelAnimationGroup을 사용하여 두 버튼의 위치를 좌우로 이동합니다.
각 애니메이션은 QPropertyAnimation을 통해 정의되며, 각각의 버튼에 대해 다양한 끝 위치(setEndValue)와 지속 시간(setDuration)을 설정합니다.

4. 애니메이션 세부 조정

QSequentialAnimationGroup과 QParallelAnimationGroup에서 애니메이션을 다루다 보면, 애니메이션의 지속 시간, 반복 가능성, 애니메이션의 시작 상태 및 종료 상태 등을 조정해야 할 경우가 많습니다.
아래에서는 애니메이션의 다양한 속성을 어떻게 설정하고 활용할 수 있는지를 살펴보겠습니다.

4.1 지속 시간 및 완료 방식

각 애니메이션 객체의 setDuration 메소드를 사용하여 애니메이션의 지속 시간을 설정할 수 있습니다.
또한 setEasingCurve 메소드를 통해 애니메이션의 완료 방식을 설정할 수 있습니다.
이 방식을 조정하면 애니메이션의 처음과 끝에서의 속도 변화에 다양한 효과를 줄 수 있습니다.

4.2 반복 및 일시 정지

애니메이션을 반복하고 싶다면 setLoopCount 메소드를 사용하여 반복할 횟수를 설정할 수 있습니다.
제어를 위해 pause()resume() 메소드를 활용하면 애니메이션을 특정 시점에서 일시 정지하고 다시 시작할 수 있습니다.

4.3 애니메이션 상태 신호 슬롯

애니메이션의 상태 변화에 따라 특정 작업을 수행해야 할 필요가 있을 수 있습니다.
이 경우 finished(), stateChanged() 등의 신호를 사용하여 애니메이션의 상태 변화에 대한 슬롯을 연결할 수 있습니다.
예를 들어, 애니메이션이 끝날 때 특정 버튼을 활성화하는 코드를 구현할 수 있습니다.

5. 결론

QSequentialAnimationGroup과 QParallelAnimationGroup은 PyQt에서 애니메이션을 효과적으로 구현할 수 있는 매우 유용한 도구입니다.
이를 통해 복잡한 사용자 인터페이스를 보다 매력적이고 직관적으로 만들 수 있습니다.
본 강좌에서 다룬 내용을 바탕으로 다양한 애니메이션을 활용하여 자신만의 독창적인 GUI 애플리케이션을 만들어보시길 바랍니다.

이 블로그 글이 PyQt 애니메이션의 이해와 활용에 도움이 되었기를 바랍니다. 더 많은 정보와 예제를 원하신다면, PyQt 공식 문서를 참고하시기 바랍니다.