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

PySide6 QComboBox 포커스 아웃 이벤트 처리 및 선택 텍스트 확인 방법

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

PySide6 QComboBox 포커스 아웃 이벤트 처리 및 선택 텍스트 확인 방법

소개

이 포스팅에서는 PySide6를 활용하여 QComboBox 위젯에서 포커스가 다른 곳으로 이동할 때 발생하는 이벤트를 감지하는 두 가지 방법을 소개합니다. 각 방법에서는 이벤트 발생 시 QComboBox에 선택된 텍스트 값을 확인하는 코드를 함께 다룹니다.

목차

  • 방법 1: QComboBox 상속을 통한 focusOutEvent 오버라이딩
  • 방법 2: 이벤트 필터(Event Filter) 사용
  • 비교 테이블
  • 필요 사항
  • 결론

방법 1: QComboBox 상속을 통한 focusOutEvent 오버라이딩

이 방법은 QComboBox를 상속받은 커스텀 클래스를 생성하여 focusOutEvent 메서드를 오버라이딩하는 방식입니다.
포커스가 다른 위젯으로 이동하면 해당 메서드가 호출되며, 이때 currentText() 메서드를 통해 선택된 텍스트 값을 확인할 수 있습니다.

import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QComboBox, QPushButton
from PySide6.QtGui import QFocusEvent

# QComboBox를 상속받은 커스텀 클래스
class CustomComboBox(QComboBox):
    def __init__(self, parent=None):
        super().__init__(parent)
    
    # 포커스가 벗어날 때 호출되는 이벤트 오버라이딩
    def focusOutEvent(self, event: QFocusEvent):
        selected_text = self.currentText()
        print("포커스가 벗어났습니다. 선택된 텍스트:", selected_text)
        super().focusOutEvent(event)

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QComboBox 포커스 아웃 이벤트 (상속 방식)")
        
        # 중앙 위젯 및 레이아웃 설정
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        layout = QVBoxLayout(central_widget)
        
        # 커스텀 QComboBox 생성 및 아이템 추가
        self.combo_box = CustomComboBox()
        self.combo_box.addItems(["Option 1", "Option 2", "Option 3"])
        layout.addWidget(self.combo_box)
        
        # 다른 위젯 추가 (포커스 이동 테스트)
        self.button = QPushButton("다른 곳으로 포커스 이동")
        layout.addWidget(self.button)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())
반응형

방법 2: 이벤트 필터(Event Filter) 사용

두 번째 방법은 QComboBox에 이벤트 필터를 설치하여 포커스 아웃 이벤트를 감지하는 방식입니다.
이 경우, 메인 윈도우 등 상위 객체에서 이벤트 필터를 구현하여 QComboBox의 포커스가 벗어날 때 선택된 텍스트 값을 출력합니다.

import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QComboBox, QPushButton
from PySide6.QtCore import QEvent

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QComboBox 포커스 아웃 이벤트 (이벤트 필터 방식)")
        
        # 중앙 위젯 및 레이아웃 설정
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        layout = QVBoxLayout(central_widget)
        
        # QComboBox 생성 및 아이템 추가
        self.combo_box = QComboBox()
        self.combo_box.addItems(["Option 1", "Option 2", "Option 3"])
        layout.addWidget(self.combo_box)
        
        # QComboBox에 이벤트 필터 설치
        self.combo_box.installEventFilter(self)
        
        # 다른 위젯 추가 (포커스 이동 테스트)
        self.button = QPushButton("다른 곳으로 포커스 이동")
        layout.addWidget(self.button)

    # 이벤트 필터 재정의
    def eventFilter(self, obj, event):
        if obj == self.combo_box and event.type() == QEvent.FocusOut:
            selected_text = self.combo_box.currentText()
            print("포커스가 벗어났습니다. 선택된 텍스트:", selected_text)
        return super().eventFilter(obj, event)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())

비교 테이블

방법 설명 적용 대상
상속을 통한 오버라이딩 QComboBox를 상속받아 focusOutEvent를 직접 오버라이드함 커스텀 위젯 제작 시
이벤트 필터 사용 QComboBox에 이벤트 필터를 설치하여 포커스 아웃 이벤트를 감지함 별도 위젯 상속 없이 구현 가능

필요 사항

  • Python 3.x: 최신 버전 권장
  • PySide6 설치: pip install PySide6
  • Qt 프레임워크 기본 이해: 위젯, 이벤트, 시그널/슬롯 개념
  • 개발 환경: IDE(예: PyCharm, VSCode) 또는 텍스트 에디터

결론

위 두 가지 방법을 통해 PySide6의 QComboBox에서 포커스가 다른 곳으로 이동할 때 선택된 텍스트 값을 확인하는 기능을 쉽게 구현할 수 있습니다. 상속을 통한 오버라이딩 방식은 커스텀 위젯 제작에 유용하며, 이벤트 필터 방식을 사용하면 별도의 클래스를 만들지 않고도 이벤트를 처리할 수 있다는 장점이 있습니다.

반응형