본문 바로가기
코딩취미/Python

[Python & PySide6] Slot을 사용하는 이유와 Slot 데코레이터의 차이점

by 브링블링 2025. 2. 25.
반응형

📌 [Python & PySide6] Slot을 사용하는 이유와 Slot 데코레이터의 차이점


📝 소개

PySide6(Python Qt)에서는 Signal-Slot 메커니즘을 사용하여 GUI 요소 간 이벤트를 연결합니다.
특히 **Slot(Slot 함수)**은 특정 Signal(신호)이 발생할 때 실행되는 함수입니다.
이번 글에서는 Slot을 사용하는 이유@Slot 데코레이터를 사용할 경우와 사용하지 않을 경우의 차이점을 초보자도 쉽게 이해할 수 있도록 정리하겠습니다.


🔍 Slot이란?

PySide6에서 Slot은 Signal과 연결되어 특정 동작을 수행하는 함수입니다.
예를 들어, 버튼을 클릭하면 clicked Signal이 발생하고, 특정 함수(Slot)를 실행할 수 있습니다.

🔹 Slot을 사용하는 이유

  1. Signal과의 연결을 쉽게 관리
    • PySide6에서는 UI 요소 간의 데이터 흐름을 Signal-Slot 구조로 연결할 수 있습니다.
  2. GUI 이벤트 처리 최적화
    • Slot은 Qt 내부적으로 최적화되어 있어 빠르고 효율적인 이벤트 처리를 제공합니다.
  3. 안정적인 이벤트 핸들링
    • Slot을 사용하면 Signal이 여러 개의 Slot과 연결될 수 있어 유연한 구조를 만들 수 있습니다.

📌 기본적인 Signal-Slot 예제

아래 예제는 PySide6에서 버튼 클릭 시 텍스트를 변경하는 Signal-Slot 구조를 보여줍니다.

from PySide6.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QVBoxLayout
from PySide6.QtCore import Signal, Slot

class MyWindow(QWidget):
    button_clicked = Signal()  # 버튼 클릭을 위한 Signal 정의

    def __init__(self):
        super().__init__()
        self.setWindowTitle("Signal & Slot Example")
        self.resize(300, 200)

        # UI 요소 생성
        self.label = QLabel("Press the button!")
        self.button = QPushButton("Click Me")
        self.button.clicked.connect(self.emit_signal)

        # Signal-Slot 연결
        self.button_clicked.connect(self.update_label)

        # 레이아웃 설정
        layout = QVBoxLayout()
        layout.addWidget(self.label)
        layout.addWidget(self.button)
        self.setLayout(layout)

    def emit_signal(self):
        """Signal을 발생시키는 메서드"""
        self.button_clicked.emit()

    @Slot()  # Slot 데코레이터 사용
    def update_label(self):
        """Label의 텍스트를 변경하는 Slot 메서드"""
        self.label.setText("Button Clicked!")

# 앱 실행
if __name__ == "__main__":
    app = QApplication([])
    window = MyWindow()
    window.show()
    app.exec()
반응형

🔹 실행 결과

  1. 초기 상태: "Press the button!"
  2. 버튼 클릭 → Signal 발생 → Slot 실행
  3. 텍스트 변경: "Button Clicked!"

🎯 @Slot 데코레이터를 사용했을 경우 vs 사용하지 않았을 경우

PySide6에서 @Slot 데코레이터는 선택적으로 사용할 수 있습니다.
하지만, 데코레이터를 사용하면 최적화된 호출 경로를 제공하고, 데이터 타입을 강제할 수 있다는 장점이 있습니다.

🔹 @Slot을 사용한 경우

from PySide6.QtCore import Slot

class Example:
    @Slot()  # Slot 데코레이터 적용
    def my_slot(self):
        print("Slot is called!")

🔹 @Slot을 사용하지 않은 경우

class Example:
    def my_slot(self):
        print("Slot is called!")

✅ 차이점 정리

특성 Slot 데코레이터 사용 Slot 데코레이터 미사용
명시적 등록 Slot임을 명확히 선언 일반적인 Python 함수
성능 최적화 Qt 내부적으로 최적화됨 Python 함수로 실행됨
타입 안정성 데이터 타입을 명시할 수 있음 타입 안정성이 없음
유지보수성 Signal-Slot 메커니즘을 명확히 표현 Slot 여부가 코드에서 명확하지 않음

🚀 Slot 데코레이터의 장점

  1. 빠른 실행 속도
    • PySide6 내부적으로 C++ 레벨에서 최적화된 호출 방식 사용
  2. 명확한 코드 구조
    • Signal과 연결되는 함수가 Slot임을 명시적으로 표현
  3. 타입 안정성 제공
    • 전달받는 데이터 타입을 명시하여 버그 방지 가능
  1.  
@Slot(int, str)
def my_slot(self, number, text):
    print(f"Number: {number}, Text: {text}")

🔥 정리

  • Slot은 Signal과 연결된 함수로 GUI 이벤트를 처리하는 핵심 요소입니다.
  • @Slot 데코레이터를 사용하면 성능 최적화, 타입 안정성, 명확한 코드 구조의 장점을 제공합니다.
  • 초보자라면 기본 Signal-Slot 구조를 이해하고, 프로젝트가 커질수록 @Slot을 적극 활용하는 것이 좋습니다.
반응형