[python] PyQt에서의 이벤트 처리

PyQt는 Python에서 사용하는 Qt 프레임워크의 파이썬 바인딩입니다. 이를 사용하여 GUI 애플리케이션을 개발할 수 있습니다. 이벤트 처리는 PyQt 애플리케이션에서 중요한 요소입니다. 이 글에서는 PyQt에서의 이벤트 처리에 대해 알아보겠습니다.

이벤트 루프

PyQt 애플리케이션은 이벤트 루프에 의해 제어됩니다. 이벤트 루프는 사용자의 입력, 타이머, 네트워크 등 다양한 이벤트를 처리하고 프로그램의 상태를 업데이트합니다.

PyQt에서 이벤트 루프를 실행하기 위해 QApplication 클래스를 생성하고 exec_() 메서드를 호출합니다. 이 메서드는 애플리케이션을 시작하고 이벤트 루프를 실행시킵니다.

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow

app = QApplication(sys.argv)

# GUI 윈도우 생성 및 설정
window = QMainWindow()
# ...

window.show()

# 이벤트 루프 실행
sys.exit(app.exec_())

이벤트 핸들링

이벤트 핸들링은 사용자의 동작에 응답하여 처리하는 과정을 말합니다. PyQt에서 이벤트 핸들링을 위해 QtCore 모듈의 시그널과 슬롯 메커니즘을 사용합니다.

시그널은 특정 이벤트가 발생했음을 알리기 위해 발신자(객체)에서 보내는 신호입니다. 슬롯은 시그널을 수신하고 처리하는 함수로써, 이벤트 핸들러로 동작합니다.

예를 들어, QPushButton 위젯의 클릭 이벤트를 처리하는 코드는 다음과 같습니다.

from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton

app = QApplication([])
window = QMainWindow()

def on_button_click():
    print("Button clicked!")

button = QPushButton("Click me")
button.clicked.connect(on_button_click)
window.setCentralWidget(button)

window.show()
app.exec_()

위 예시에서는 QPushButton 위젯을 생성하고, clicked 시그널에 대해 on_button_click 함수를 슬롯으로 연결합니다. 클릭 이벤트가 발생하면 연결된 슬롯 함수가 호출되어 “Button clicked!”라는 메시지가 출력됩니다.

커스텀 이벤트

PyQt에서는 시그널 및 이벤트 핸들링 기능을 사용하여 커스텀 이벤트를 처리할 수도 있습니다. 커스텀 이벤트를 처리하기 위해서는 QtCore.QEvent 클래스를 상속받은 이벤트 클래스를 만들고 이를 발생시키는 시그널을 정의해야 합니다.

from PyQt5.QtCore import QObject, pyqtSignal, QEvent

class CustomEvent(QEvent):
    def __init__(self):
        QEvent.__init__(self, QEvent.User)

class MyObject(QObject):
    customEventOccurred = pyqtSignal()

    def __init__(self):
        QObject.__init__(self)

    def event(self, event):
        if event.type() == QEvent.User:
            self.customEventOccurred.emit()
            return True
        return QObject.event(self, event)

app = QApplication([])
my_object = MyObject()

def on_custom_event():
    print("Custom event occurred!")

my_object.customEventOccurred.connect(on_custom_event)

custom_event = CustomEvent()
my_object.event(custom_event)

app.exec_()

위 예시에서는 customEventOccurred 시그널을 발생시키는 커스텀 이벤트 클래스 CustomEvent를 정의합니다. MyObject 클래스에서 해당 이벤트를 처리하기 위해 event 메서드를 오버라이딩하고, 사용자 정의 이벤트를 수신하면 customEventOccurred 시그널을 발생시킵니다.

결론

PyQt에서 이벤트 처리는 사용자의 동작을 감지하고 애플리케이션의 상태를 변경하는 중요한 부분입니다. PyQt의 이벤트 루프를 이해하고, 시그널과 슬롯 메커니즘을 사용하여 이벤트를 처리하는 방법을 익히는 것은 PyQt 애플리케이션 개발에 필수적입니다.

더 많은 이벤트 처리 방법과 PyQt의 다른 기능들을 알아보고 싶다면 PyQt 공식 문서와 예제 코드를 참고하시기 바랍니다.

참고 자료