본문 바로가기
목차
Python/PySide PyQt

[PySide6] QWidget.setFocusPolicy(policy: Qt.FocusPolicy)

by ds31x 2025. 5. 13.
728x90
반응형

PySide6의 포커스 정책 (FocusPolicy) : 

PySide6에서 QWidget 클래스의 setFocusPolicy() 메서드는 위젯이 키보드 포커스를 어떻게 받을지 결정함


Method Signature : 

# QWidget 클래스의 메서드
QWidget.setFocusPolicy(policy: Qt.FocusPolicy)
  • 여기서 policy는 다음에 설명된 Qt.FocusPolicy 열거형(Enum Type) 값 중 하나임.

포커스 정책 종류 : 

  • Qt.NoFocus: 키보드 포커스를 받지 않음
  • Qt.TabFocus: 탭 키로만 포커스 받음
  • Qt.ClickFocus: 마우스 클릭으로만 포커스 받음
  • Qt.StrongFocus: 탭 키와 마우스 클릭으로 포커스 받음
  • Qt.WheelFocus: 탭 키, 마우스 클릭, 마우스 휠로 포커스 받음

Example : 

아래 예제는 서로 다른 포커스 정책을 가진 여러 Widget을 보여줌.

import sys
from PySide6.QtWidgets import (QApplication, QMainWindow, QVBoxLayout, 
                              QWidget, QTextEdit, QLabel)
from PySide6.QtCore import Qt

class FocusPolicyDemo(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("PySide6 포커스 정책 데모")
        self.setGeometry(100, 100, 500, 600)

        # 중앙 위젯 설정
        central_widget = QWidget()
        self.setCentralWidget(central_widget)

        # 레이아웃 생성
        layout = QVBoxLayout(central_widget)

        # NoFocus 위젯
        layout.addWidget(QLabel("Qt.NoFocus - 키보드 포커스를 받지 않음:"))
        no_focus = QTextEdit("이 텍스트 편집기는 포커스를 받지 않습니다. 클릭해도 수정할 수 없습니다.")
        no_focus.setFocusPolicy(Qt.NoFocus)
        layout.addWidget(no_focus)

        # TabFocus 위젯
        layout.addWidget(QLabel("Qt.TabFocus - 탭 키로만 포커스 받음:"))
        tab_focus = QTextEdit("이 텍스트 편집기는 탭 키로만 포커스를 받습니다. 클릭해도 포커스가 오지 않습니다.")
        tab_focus.setFocusPolicy(Qt.TabFocus)
        layout.addWidget(tab_focus)

        # ClickFocus 위젯
        layout.addWidget(QLabel("Qt.ClickFocus - 마우스 클릭으로만 포커스 받음:"))
        click_focus = QTextEdit("이 텍스트 편집기는 클릭으로만 포커스를 받습니다. 탭 키로는 이동할 수 없습니다.")
        click_focus.setFocusPolicy(Qt.ClickFocus)
        layout.addWidget(click_focus)

        # StrongFocus 위젯
        layout.addWidget(QLabel("Qt.StrongFocus - 탭 키와 마우스 클릭으로 포커스 받음:"))
        strong_focus = QTextEdit("이 텍스트 편집기는 탭 키와 클릭 모두로 포커스를 받습니다.")
        strong_focus.setFocusPolicy(Qt.StrongFocus)
        layout.addWidget(strong_focus)

        # WheelFocus 위젯
        layout.addWidget(QLabel("Qt.WheelFocus - 탭 키, 마우스 클릭, 마우스 휠로 포커스 받음:"))
        wheel_focus = QTextEdit("이 텍스트 편집기는 탭 키, 클릭, 휠 모두로 포커스를 받습니다.")
        wheel_focus.setFocusPolicy(Qt.WheelFocus)
        layout.addWidget(wheel_focus)

        # 초기 포커스 설정
        strong_focus.setFocus()

    def keyPressEvent(self, event):
        # ESC 키를 누르면 애플리케이션 종료
        if event.key() == Qt.Key_Escape:
            self.close()
        else:
            super().keyPressEvent(event)

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

사용 시나리오 : 

  • Qt.NoFocus: QLabel, QFrame, QGroupBox, QProgressBar 등 키보드 입력이 필요 없는 표시 전용 위젯
  • Qt.TabFocus: QLineEdit, QSpinBox, QDateEdit 등 탭 키로 순서대로 접근해야 하는 폼 필드
  • Qt.ClickFocus: QToolButton, QMenu 등 클릭으로만 활성화되는 특수 컨트롤
  • Qt.StrongFocus: QPushButton, QCheckBox, QRadioButton, QComboBox 등 일반적인 입력 위젯 (가장 일반적인 설정)
  • Qt.WheelFocus: QListView, QTreeView, QTableView, QScrollArea 등 휠 이벤트가 중요한 위젯

참고사항 : 

  • QWidget.setFocus() 메서드는 위젯에 즉시 포커스를 부여: QWidget.setFocus()
  • 현재 포커스 정책을 확인하려면 QWidget.focusPolicy() 메서드를 사용: Qt.FocusPolicy 객체를 반환.

 

728x90