Spec-Zone.ru › Qt 5.6

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

Виджеты 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. В то время как он перемещает фокус на виджет, для виджетов-редакторов он также перемещает курсор текста (внутренний фокус виджета) в место, где щелкнули мышкой.

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

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

Мы рекомендуем поддерживать щелчок для перевода фокуса для виджетов, поддерживающих ввод текста, и избегать этого для большинства виджетов, где щелчок мышью имеет другой эффект. (Для кнопок мы также рекомендуем добавить сочетание клавиш: 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/archives/qt-5.6/focus.html

Spec-Zone.ru

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