위젯의 키보드 포커스
Qt의 위젯은 GUI에서 관례화된 방식으로 키보드 포커스를 처리합니다.
기본적인 문제는 사용자의 키 입력이 화면의 여러 창과 의도한 창 안의 여러 위젯 중 어느 곳으로든 향할 수 있다는 것입니다. 사용자는 키를 누를 때 올바른 위치로 이동하기를 기대하며 소프트웨어는 이러한 기대에 부응해야 합니다. 시스템은 키 입력이 어떤 애플리케이션, 해당 애플리케이션 내의 어떤 창, 해당 창 내의 어떤 위젯을 향하는지 결정해야 합니다.
초점 모션
키보드 포커스를 특정 위젯으로 지정하기 위해 발전된 관습은 다음과 같습니다:
- 사용자가 Tab (또는 Shift+Tab)을 누릅니다.
- 사용자가 위젯을 클릭합니다.
- 사용자가 키보드 단축키를 누릅니다.
- 사용자가 마우스 휠을 사용합니다.
- 사용자가 포커스를 창으로 이동하면 애플리케이션이 창 내의 어느 위젯에 포커스를 가져올지 결정해야 합니다.
이러한 모션 메커니즘은 각각 다르며, 위젯 유형에 따라 일부 위젯에만 포커스를 받습니다. 각 모션 메커니즘을 차례로 살펴보겠습니다.
Tab 또는 Shift+Tab
Tab 을 누르는 것이 키보드를 사용하여 초점을 이동하는 가장 일반적인 방법입니다. (가끔 데이터 입력 애플리케이션에서 Enter가 Tab 와 같은 역할을 하기도 합니다; Qt에서는 이벤트 필터를 구현하여 쉽게 달성할 수 있습니다).
오늘날 일반적으로 사용되는 모든 창 시스템에서 Tab 을 누르면 키보드 포커스가 창별 원형 목록의 다음 위젯으로 이동합니다. Tab 은 원형 목록을 따라 한 방향으로, Shift+Tab 은 다른 방향으로 포커스를 이동합니다. Tab 을 누를 때 위젯에서 위젯으로 이동하는 순서를 탭 순서라고 합니다.
QWidget::setTabOrder()를 사용하여 탭 순서를 사용자 지정할 수 있습니다. (그렇지 않은 경우 Tab 은 일반적으로 위젯 구성 순서대로 초점을 이동합니다.) Qt Widgets Designer 은 탭 순서를 시각적으로 변경할 수 있는 수단을 제공합니다.
Tab 을 누르는 것이 매우 일반적이므로 포커스를 가질 수 있는 대부분의 위젯은 탭 포커스를 지원해야 합니다. 주요 예외는 거의 사용되지 않는 위젯으로, 초점을 이동하는 키보드 가속기나 오류 처리기가 있는 경우입니다.
예를 들어 데이터 입력 대화상자에는 전체 사례 중 1%의 경우에만 필요한 필드가 있을 수 있습니다. 이러한 대화 상자에서 Tab 은 이 필드를 건너뛸 수 있으며, 대화 상자는 이러한 메커니즘 중 하나를 사용할 수 있습니다:
- 프로그램이 해당 필드의 필요 여부를 판단할 수 있다면 사용자가 입력을 완료하고 OK 을 누르거나 사용자가 다른 필드를 완료한 후 Enter 키를 누를 때 해당 필드로 포커스를 이동할 수 있습니다. 또는 해당 필드를 탭 순서에 포함하되 비활성화할 수 있습니다. 사용자가 다른 필드에 설정한 내용을 고려할 때 적절하다고 판단되면 활성화합니다.
- 필드 레이블에는 이 필드로 초점을 이동하는 키보드 단축키를 포함할 수 있습니다.
Tab 지원의 또 다른 예외는 탭 삽입을 지원해야 하는 텍스트 입력 위젯으로, 거의 모든 텍스트 편집기가 이 클래스에 속합니다. Qt는 Ctrl+Tab 를 Tab 로, Ctrl+Shift+Tab 를 Shift+Tab 로 취급하며, 이러한 위젯은 QWidget::event()를 재구현하고 Tab 을 처리한 후 QWidget::event()를 호출하여 다른 모든 키를 정상적으로 처리할 수 있습니다. 그러나 일부 시스템에서는 Ctrl+Tab 을 다른 용도로 사용하기도 하고 Ctrl+Tab 을 모르는 사용자도 많기 때문에 이 방법은 완전한 해결책이 아닙니다.
사용자가 위젯을 클릭하는 경우
마우스나 기타 포인팅 디바이스를 사용하는 컴퓨터에서 Tab 을 누르는 것보다 훨씬 더 일반적인 방법입니다.
클릭으로 초점을 이동하는 것이 Tab 보다 약간 더 강력합니다. 위젯으로 초점을 이동하지만 편집기 위젯의 경우 텍스트 커서(위젯의 내부 포커스)도 마우스가 클릭된 위치로 이동합니다.
이 기능은 매우 일반적이고 사람들이 익숙하기 때문에 대부분의 위젯에서 지원하는 것이 좋습니다. 그러나 이 기능을 사용하지 않는 중요한 이유도 있습니다. 포커스가 있던 위젯에서 포커스를 제거하고 싶지 않을 수도 있습니다.
예를 들어 워드 프로세서에서 사용자가 'B'(굵게) 도구 버튼을 클릭하면 키보드 초점은 어떻게 될까요? 거의 확실하게 편집 위젯에 있던 곳에 그대로 있어야 할까요, 아니면 'B' 버튼으로 이동해야 할까요?
텍스트 입력을 지원하는 위젯에는 클릭 투 포커스 기능을 지원하고, 마우스 클릭으로 다른 효과를 내는 대부분의 위젯에는 이 기능을 사용하지 않는 것이 좋습니다. (버튼의 경우 키보드 단축키를 추가하는 것도 좋습니다: QAbstractButton 및 그 하위 클래스를 사용하면 매우 쉽습니다.)
Qt에서는 QWidget::setFocusPolicy() 함수만 클릭 투 포커스에 영향을 줍니다.
사용자가 키보드 단축키를 누르는 경우
키보드 단축키로 초점을 이동하는 것은 드문 일이 아닙니다. 이는 모달 대화 상자를 열어서 암시적으로 발생할 수도 있지만 QLabel::setBuddy(), QGroupBox, QTabBar 에서 제공하는 것과 같은 포커스 가속기를 사용하여 명시적으로 발생할 수도 있습니다.
애플리케이션은 사용자가 이동하고자 하는 모든 위젯에 대해 바로 가기 포커스를 지원할 수 있습니다. 예를 들어 탭 대화상자에는 각 페이지에 대한 키보드 단축키가 있을 수 있으므로 사용자는 예를 들어 Alt+P 을 눌러 인쇄페이지로 이동할 수 있습니다. 키가 몇 개 밖에 없기 때문에 지나치기 쉬우므로 명령에 대한 키보드 단축키를 제공하는 것도 중요하다는 점에 유의하세요. 대상 플랫폼의 디자인 가이드라인(예: Microsoft의 키보드 사용자 인터페이스 디자인 가이드라인 또는 Apple의 초점 및 선택 가이드라인)을 참조하세요.
사용자가 마우스 휠을 회전하는 경우
Microsoft Windows에서는 마우스 휠 사용이 항상 키보드 초점이 있는 위젯에 의해 처리됩니다. macOS와 X11에서는 다른 마우스 이벤트를 수신하는 위젯이 이를 처리합니다.
Qt가 이러한 플랫폼 차이를 처리하는 방식은 휠이 사용될 때 위젯이 키보드 포커스를 이동하도록 하는 것입니다. 각 위젯에 올바른 포커스 정책을 적용하면 애플리케이션이 Windows, macOS 및 X11에서 관용적으로 올바르게 작동할 수 있습니다.
사용자가 이 창으로 포커스를 이동하는 경우
이 경우 애플리케이션은 창 내에서 어느 위젯이 포커스를 받을지 결정해야 합니다.
이는 간단할 수 있습니다: 이전에 포커스가 이 창에 있었다면 마지막으로 포커스를 가졌던 위젯이 포커스를 되찾아야 합니다. Qt는 이 작업을 자동으로 수행합니다.
포커스가 이전에 이 창에 있었던 적이 없고 포커스가 시작되어야 할 위치를 알고 있다면, 포커스를 받아야 할 위젯에 QWidget::show()을 호출하기 전에 QWidget::setFocus()을 호출합니다. 그렇지 않으면 Qt가 적절한 위젯을 선택합니다.
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.