반응형
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에서 포커스가 다른 곳으로 이동할 때 선택된 텍스트 값을 확인하는 기능을 쉽게 구현할 수 있습니다. 상속을 통한 오버라이딩 방식은 커스텀 위젯 제작에 유용하며, 이벤트 필터 방식을 사용하면 별도의 클래스를 만들지 않고도 이벤트를 처리할 수 있다는 장점이 있습니다.
반응형
'코딩취미 > Python' 카테고리의 다른 글
PySide6에서 여러 개의 QLabel 스타일 일괄 설정하기 (0) | 2025.02.22 |
---|---|
PySide6에서 QLabel 스타일 변경 및 Sunken 효과 적용하기 (0) | 2025.02.22 |
QFileDialog 특정폴더를 기본 경로 설정하기 (0) | 2025.02.21 |
PySide6에서 다크 모드 시 RibbonBar 텍스트 색상 설정하기 (0) | 2025.02.21 |
파이썬에서 특정 클래스의 멤버 함수를 확인하는 방법 (0) | 2025.02.20 |