Spec-Zone.ru › Qt 5.12

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

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

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

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

Принятые правила для направления фокуса клавиатуры на конкретный виджет таковы:

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

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

Нажатие Tab или Shift+Tab

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

Нажатие клавиши 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 для других целей, и многие пользователи не осведомлены о 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-5.12/focus.html

Spec-Zone.ru

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