Spec-Zone.ru › Qt 5.13

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

Виджеты 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. Если программа может определить, нужно ли это поле, она может переместить фокус туда, когда пользователь завершит ввод и нажмёт ОК, или когда пользователь нажмёт Enter после завершения других полей. В качестве альтернативы, включите поле в порядок табуляции, но отключите его. Включите его, если это станет уместно с учётом того, что пользователь установил в других полях.
  2. Метка поля может содержать сочетание клавиш, которое перемещает фокус в это поле.

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

Щелчок пользователя по виджету

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

Щелчок для перемещения фокуса немного сильнее, чем Tab. В то время как он перемещает фокус в виджет, для виджетов редактора он также перемещает курсор текста (внутренний фокус виджета) в точку, где щелкнула мышь.

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

Например, в текстовом редакторе, когда пользователь нажимает на инструмент «Жирное» («B»), что должно произойти с фокусом клавиатуры? Должен ли он остаться там, где он был, почти наверняка в виджете редактирования, или он должен переместиться на кнопку «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.13/focus.html

Spec-Zone.ru

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