위젯의 키보드 포커스
Qt Widgets는 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()를 재구현하고 QWidget::event()를 호출하기 전에 Tab을 처리하여 다른 모든 키에 대한 정상적인 처리를 수행할 수 있습니다. 그러나 일부 시스템에서는 Ctrl+Tab 를 다른 용도로 사용하며, 많은 사용자가 Ctrl+Tab 를 잘 알지 못하기 때문에 이는 완벽한 해결책은 아닙니다.
사용자가 위젯을 클릭하는 경우
이는 마우스나 기타 포인팅 장치가 있는 컴퓨터에서 Tab 키를 누르는 것보다 훨씬 더 흔한 경우일 수 있습니다.
클릭하여 포커스를 이동시키는 것은 Tab 보다 약간 더 강력한 기능입니다. 포커스를 위젯으로 이동시키는 동시에, 편집기 위젯의 경우 텍스트 커서(위젯의 내부 포커스)도 마우스가 클릭된 위치로 이동시킵니다.
이 동작은 매우 흔하고 사용자들이 익숙해져 있으므로, 대부분의 위젯에서 이를 지원하는 것이 좋습니다. 하지만 이를 피해야 할 중요한 이유도 있습니다. 바로 원래 위치에 있던 위젯에서 포커스를 제거하고 싶지 않을 수 있기 때문입니다.
예를 들어, 워드 프로세서에서 사용자가 ‘B’(굵게) 도구 버튼을 클릭할 때 키보드 포커스는 어떻게 되어야 할까요? 기존 위치, 즉 거의 확실히 편집 위젯에 그대로 남아 있어야 할까요, 아니면 ‘B’ 버튼으로 이동해야 할까요?
텍스트 입력을 지원하는 위젯의 경우 ‘클릭-투-포커스’를 지원하는 것이 좋으며, 마우스 클릭이 다른 효과를 갖는 대부분의 위젯에서는 이를 피하는 것이 좋습니다. (버튼의 경우, 키보드 단축키를 추가하는 것도 권장합니다. ` QAbstractButton ` 및 그 하위 클래스를 사용하면 이를 매우 쉽게 구현할 수 있습니다.)
Qt XML에서는 QWidget::setFocusPolicy() 함수만이 클릭 시 포커스 이동에 영향을 미칩니다.
사용자가 키보드 단축키를 누르는 경우
키보드 단축키가 포커스를 이동시키는 것은 드문 일이 아닙니다. 이는 모달 대화 상자를 열 때 암시적으로 발생할 수 있지만, QLabel::setBuddy(), QGroupBox 및 QTabBar 에서 제공하는 것과 같은 포커스 가속기를 명시적으로 사용하여 발생할 수도 있습니다.
애플리케이션은 사용자가 이동하고자 할 수 있는 모든 위젯에 대해 단축키 포커스를 지원할 수 있습니다. 예를 들어, 탭 대화 상자에는 각 페이지에 대한 키보드 단축키가 있을 수 있으므로, 사용자는 Alt+P 을 눌러 인쇄페이지로 이동할 수 있습니다. 사용 가능한 키가 제한적이기 때문에 이를 지나치게 남용하기 쉬우며, 명령어에 대한 키보드 단축키를 제공하는 것도 중요하다는 점을 명심하십시오. 대상 플랫폼의 디자인 지침(예: Microsoft의 키보드 사용자 인터페이스 디자인 지침 또는 Apple의 포커스 및 선택 지침)을 참조하십시오.
사용자가 마우스 휠을 돌리는 경우
Microsoft Windows에서는 마우스 휠 사용이 항상 키보드 포커스를 가진 위젯에 의해 처리됩니다. macOS 및 X11에서는 다른 마우스 이벤트를 수신하는 위젯에 의해 처리됩니다.
Qt Widgets는 휠이 사용될 때 위젯이 키보드 포커스를 이동하도록 함으로써 이러한 플랫폼 간 차이를 처리합니다. 각 위젯에 적절한 포커스 정책을 적용하면, 애플리케이션은 Windows, macOS 및 X11에서 모두 자연스럽게 올바르게 작동할 수 있습니다.
사용자가 포커스를 이 창으로 이동시키는 경우
이 경우 애플리케이션은 창 내의 어떤 위젯이 포커스를 받아야 하는지 결정해야 합니다.
이는 간단할 수 있습니다. 이전에 이 창에 포커스가 있었던 적이 있다면, 마지막으로 포커스를 가졌던 위젯이 다시 포커스를 가져가면 됩니다. Qt는 이를 자동으로 처리합니다.
이 창에 포커스가 한 번도 있었던 적이 없고 포커스가 시작되어야 할 위치를 알고 있는 경우, ` QWidget::show()`를 호출하기 전에 포커스를 받아야 할 위젯에서 ` QWidget::setFocus()`를 호출하십시오. 그렇지 않으면 Qt가 적절한 위젯을 선택합니다.
© 2026 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.