Spec-Zone.ru › Qt 6.1

Фокусирование клавиатуры в виджетах

Виджеты Qt обрабатывают фокус клавиатуры так, как это стало традицией в графических интерфейсах.

Основная проблема заключается в том, что нажатия клавиш пользователя могут быть направлены на любой из нескольких окон на экране, и любой из нескольких виджетов внутри целевого окна. Когда пользователь нажимает клавишу, он ожидает, что она будет обработана в нужном месте, и программное обеспечение должно попытаться удовлетворить это ожидание. Система должна определить, к какому приложению направлено нажатие клавиши, к какому окну внутри этого приложения и к какому виджету внутри этого окна.

Движение фокуса

Традиции, которые выработались для направления фокуса клавиатуры на конкретный виджет, таковы:

  1. Пользователь нажимает клавишу Tab (или Shift+Tab).
  2. Пользователь нажимает на виджет.
  3. Пользователь нажимает сочетание клавиш.
  4. Пользователь использует колесо мыши.
  5. Пользователь перемещает фокус на окно, и приложение должно определить, какой виджет внутри окна должен получить фокус.

Каждый из этих механизмов перемещения отличается, и разные типы виджетов получают фокус только в некоторых из них. Мы рассмотрим каждый из них по очереди.

Клавиша Tab или Shift+Tab

Нажатие клавиши Tab является, пожалуй, самым распространённым способом перемещения фокуса с помощью клавиатуры. (Иногда в приложениях для ввода данных клавиша Enter выполняет ту же функцию, что и Tab; это легко достигается в Qt путём реализации фильтра событий event filter.)

Нажатие клавиши Tab во всех распространённых сегодня оконных системах перемещает фокус клавиатуры к следующему виджету в циклическом списке внутри окна. Tab перемещает фокус по круговому списку в одном направлении, а Shift+Tab — в другом. Порядок, в котором нажатия Tab перемещают фокус от виджета к виджету, называется порядком табуляции.

Вы можете настроить порядок табуляции, используя QWidget::setTabOrder(). (Если вы этого не сделаете, Tab, как правило, перемещает фокус в порядке создания виджетов.) Qt Designer предоставляет средство визуального изменения порядка табуляции.

Поскольку нажатие клавиши Tab так часто используется, большинство виджетов, которые могут иметь фокус, должны поддерживать фокус табуляции. Главное исключение — это редко используемые виджеты, для которых существует некоторая обработка сочетаний клавиш или ошибок, перемещающих фокус.

Например, в диалоге ввода данных может быть поле, которое необходимо только в одном проценте всех случаев. В таком диалоге Tab может пропускать это поле, а диалог может использовать один из этих механизмов:

  1. Если программа может определить, нужно ли поле, она может переместить фокус туда, когда пользователь закончит ввод и нажмёт OK или когда пользователь нажмёт Enter после заполнения других полей. В качестве альтернативы, включите поле в порядок табуляции, но отключите его. Включите его, если это будет уместно, с учётом того, что пользователь установил в других полях.
  2. Метка поля может содержать сочетание клавиш, которое переместит фокус в это поле.

Ещё одним исключением из поддержки Tab являются виджеты ввода текста, которые должны поддерживать вставку символов табуляции; почти все текстовые редакторы относятся к этому классу. Qt обрабатывает Ctrl+Tab как Tab и Ctrl+Shift+Tab как Shift+Tab, и такие виджеты могут переопределить QWidget::event() и обработать Tab перед вызовом QWidget::event() для получения обычной обработки всех остальных клавиш. Однако, поскольку некоторые системы используют Ctrl+Tab для других целей, и многие пользователи об этом не знают, это не является полным решением.

Нажатие пользователем на виджет

Это, пожалуй, ещё более распространено, чем нажатие клавиши Tab на компьютерах с мышью или другим указательным устройством.

Нажатие для перемещения фокуса немного более мощный механизм, чем Tab. Хотя оно перемещает фокус на виджет, для виджетов редактора оно также перемещает курсор текста (внутренний фокус виджета) в точку, где щелкнули мышью.

Поскольку это так часто используется и люди к этому привыкли, рекомендуется поддерживать его для большинства виджетов. Однако есть и важная причина избегать его: вам может не захотеться снимать фокус с виджета, где он находился.

Например, в текстовом процессоре, когда пользователь нажимает на кнопку инструмента «Жирный» ('B'), что должно произойти с фокусом клавиатуры? Должен ли он остаться там, где он был, почти наверняка в виджете редактирования, или он должен переместиться на кнопку «Жирный»?

Рекомендуется поддерживать фокус при щелчке для виджетов, которые поддерживают ввод текста, и избегать этого для большинства виджетов, где щелчок мышью имеет другое действие. (Для кнопок также рекомендуется добавить сочетание клавиш: QAbstractButton и его подклассы делают это очень легко.)

В Qt только функция QWidget::setFocusPolicy() влияет на фокус при нажатии.

Нажатие пользователем сочетания клавиш

Не является чем-то необычным, когда сочетания клавиш перемещают фокус. Это может произойти неявно при открытии модальных диалогов, но также и явно с помощью акселераторов фокуса, таких как те, что предоставляются QLabel::setBuddy(), QGroupBox и QTabBar.

Рекомендуется поддерживать фокус при использовании сочетаний клавиш для всех виджетов, которые пользователь может захотеть активировать. Например, диалог вкладок может иметь сочетания клавиш для каждой из своих страниц, поэтому пользователь может нажать, например, Alt+P, чтобы перейти на страницу Pечать. Легко переусердствовать: доступно ограниченное количество клавиш, а также важно предоставить сочетания клавиш для команд. Alt+P также используется для Вставки, Воспроизведения, Печати и Печати сюда в списке Стандартных сочетаний клавиш, например.

Вращение пользователем колеса мыши

В Microsoft Windows использование колеса мыши всегда обрабатывается виджетом, у которого есть фокус клавиатуры. В macOS и X11 оно обрабатывается виджетом, который получает другие события мыши.

Способ, которым Qt обрабатывает это различие между платформами, заключается в том, что виджеты перемещают фокус клавиатуры при использовании колеса. С помощью правильной политики фокуса для каждого виджета приложения могут работать в соответствии с особенностями Windows, macOS и X11.

Перемещение фокуса пользователя в это окно

В этой ситуации приложение должно определить, какой виджет внутри окна должен получить фокус.

Это может быть просто: если фокус был в этом окне раньше, то последний виджет, имевший фокус, должен его вернуть. Qt делает это автоматически.

Если фокус никогда не был в этом окне и вам известно, с какого виджета фокус должен начинаться, вызовите QWidget::setFocus() для виджета, который должен получить фокус, перед вызовом QWidget::show() для него. Если вы этого не сделаете, Qt выберет подходящий виджет.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.1/focus.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API