Script/Python

PyQt5 Signal Slot Connect Emit QState 예제 설명

Bloger A 2024. 5. 7. 07:46
반응형

 

 

Qt 프레임워크 도저히 모르겠어서 ChatGPT한테 물어봄

하 진짜 어케하는거냐

 

 

QState 및 관련 클래스 이해

QState는 상태 머신 내의 개별 상태를 나타내며, 각 상태는 특정 이벤트가 발생했을 때 다른 상태로의 전환을 정의할 수 있습니다. 상태 머신은 이벤트 기반 프로그래밍에서 유용하게 사용되며, 다양한 상태 간의 전환을 관리하는 로직을 구현하는 데 적합합니다.

  • QState: 상태를 나타내며, 여러 상태를 중첩할 수 있습니다.
  • QFinalState: 상태 머신의 종료 상태를 나타냅니다. 이 상태에 도달하면 상태 머신의 실행이 종료됩니다.
  • QStateMachine: 여러 QState 객체들을 포함하고 관리하는 컨테이너 역할을 합니다.

 

전체 코드와의 연결

방금 전에 올린 코드에서는 여러 상태(QState)와 그들 사이의 전환을 설정하고 있습니다. 각 상태는 특정 이벤트(sigInitOk, sigConnected 등)가 발생할 때 다른 상태로 전환되도록 설정되어 있습니다. 이벤트는 시그널로 표현되며, addTransition 메서드를 사용하여 이벤트와 그에 따른 상태 전환을 연결합니다.

 

간단한 예제 코드

간단한 예제를 통해 QState와 QStateMachine의 기본적인 사용법을 설명하겠습니다. 아래 예제에서는 간단한 상태 머신을 설정하고, 몇 가지 상태와 전환을 정의합니다.

 

from PyQt5.QtCore import QStateMachine, QState, QFinalState, pyqtSignal, QObject

class AppContext(QObject):
    sigStart = pyqtSignal()
    sigStep = pyqtSignal()
    sigEnd = pyqtSignal()

    def __init__(self):
        super().__init__()
        self.setupStateMachine()

    def setupStateMachine(self):
        self.stateMachine = QStateMachine()

        startState = QState()
        stepState = QState()
        finalState = QFinalState()

        self.stateMachine.addState(startState)
        self.stateMachine.addState(stepState)
        self.stateMachine.addState(finalState)

        startState.addTransition(self.sigStep, stepState)
        stepState.addTransition(self.sigEnd, finalState)

        self.stateMachine.setInitialState(startState)
        self.stateMachine.finished.connect(self.onFinished)

        startState.entered.connect(lambda: print("Entered Start State"))
        stepState.entered.connect(lambda: print("Entered Step State"))
        finalState.entered.connect(lambda: print("Entered Final State"))

    def onFinished(self):
        print("State machine finished")

    def start(self):
        self.stateMachine.start()

app = AppContext()
app.start()
app.sigStep.emit()
app.sigEnd.emit()

 

이 예제는 시작 상태에서 시작하여, 단계별로 최종 상태로 전환하는 간단한 상태 머신을 구현합니다. 각 상태에는 상태에 진입했을 때 실행될 함수가 연결되어 있습니다.

 

 

1. 클래스 및 신호 정의

from PyQt5.QtCore import QStateMachine, QState, QFinalState, pyqtSignal, QObject

class AppContext(QObject):
    sigStart = pyqtSignal()
    sigStep = pyqtSignal()
    sigEnd = pyqtSignal()
  • QObject와 상속: AppContext 클래스는 QObject를 상속받아 PyQt 프레임워크의 이벤트 시스템을 사용할 수 있게 합니다.
  • pyqtSignal: sigStart, sigStep, sigEnd는 PyQt에서 제공하는 pyqtSignal을 이용하여 사용자 정의 신호를 만듭니다. 이 신호들은 상태 전환에 사용됩니다.

 

2. 초기화 및 상태 머신 설정

def __init__(self):
    super().__init__()
    self.setupStateMachine()

def setupStateMachine(self):
    self.stateMachine = QStateMachine()
  • __init__: 객체가 생성될 때 초기화를 담당합니다. setupStateMachine 메서드를 호출하여 상태 머신을 설정합니다.
  • QStateMachine 객체 생성: 상태 머신 인스턴스를 생성합니다.

 

3. 상태 정의 및 추가

startState = QState()
stepState = QState()
finalState = QFinalState()

self.stateMachine.addState(startState)
self.stateMachine.addState(stepState)
self.stateMachine.addState(finalState)
  • QState와 QFinalState: 각각의 상태를 생성합니다. QFinalState는 상태 머신이 종료될 최종 상태를 나타냅니다.
  • 상태 추가: 생성된 각 상태를 상태 머신에 추가합니다.

 

4. 전이 정의

startState.addTransition(self.sigStep, stepState)
stepState.addTransition(self.sigEnd, finalState)
  • addTransition: 특정 신호가 발생했을 때 다음 상태로의 전환을 정의합니다. 예를 들어, startState에서 sigStep 신호가 발생하면 stepState로 전환됩니다.

 

5. 초기 상태 설정 및 시그널 연결

self.stateMachine.setInitialState(startState)
self.stateMachine.finished.connect(self.onFinished)
  • setInitialState: 상태 머신의 시작 상태를 설정합니다.
  • finished 시그널: 상태 머신이 종료될 때 호출될 함수를 연결합니다.

 

6. 상태 진입 시 동작 연결

startState.entered.connect(lambda: print("Entered Start State"))
stepState.entered.connect(lambda: print("Entered Step State"))
finalState.entered.connect(lambda: print("Entered Final State"))
  • entered 시그널: 상태에 진입할 때 실행될 함수를 연결합니다. 여기서는 간단한 출력을 통해 어떤 상태에 진입했는지를 나타냅니다.

 

7. 상태 머신 실행

def start(self):
    self.stateMachine.start()

app = AppContext()
app.start()
app.sigStep.emit()
app.sigEnd.emit()
  • 상태 머신 시작: start 메서드를 통해 상태 머신을 시작합니다.
  • 신호 발생: sigStep과 sigEnd 신호를 발생시켜 상태 전환을 트리거합니다.

 

이 코드를 통해 PyQt의 QStateMachine을 사용하여 복잡한 상태 관리와 이벤트 처리를 구현할 수 있습니다. 이 예제는 각 상태에 진입할 때마다 콘솔에 메시지를 출력하도록 설정되어 있어, 상태 머신의 흐름을 쉽게 추적할 수 있습니다.

반응형