Фокус ввода с клавиатурыВиджеты Qt обрабатывают фокус ввода с клавиатуры способами, которые стали привычными в ГПИ. Основная проблема заключается в том, что нажатие клавиши пользователем может быть направлено любому из нескольких окон на экране, и любому из нескольких виджетов внутри запланированного окна. Когда пользователь нажимает клавишу, он ожидает отправки её в нужное место и программное обеспечение должно попытаться соответствовать этим ожиданиям. Система должна определить, в какое приложение направить нажатую клавишу, в какое окно внутри этого приложения и в какой виджет этого окна. Поведение фокуса вводаДля направления фокуса ввода с клавиатуры в конкретный виджет, выявлены следующие традиции:
Каждый из этих механизмов движения различны, и разные типы виджетов получают фокус только в некоторых из них. Мы по очереди расскажем о них всех. Tab или Shift+TabНажатие клавиши Tab - практически общепризнанный способ переместить фокус ввода используя клавиатуру. (Иногда в приложениях ввода данных клавиша Enter делает то же самое, что и Tab; этого легко добиться в Qt, реализовав фильтр событий.) Во всех оконных системах, используемых сегодня, нажатие Tab перемещает фокус ввода с клавиатуры на следующий в замкнутом списке окон виджет. Tab перемещает фокус по замкнутому списку в одном направлении, а Shift+Tab - в другом. Порядок, в котором нажатия клавиши Tab перемещают фокус от виджета к виджету, называется порядком обхода. Вы можете настроить порядок обхода используя QWidget::setTabOrder(). (Если вы этого не сделаете, Tab обычно перемещает фокус в том порядке, в котором виджеты создавались.) Qt Designer предоставляет возможность визуально изменить порядок обхода. Так как нажатие Tab является настолько обычным, большинство виджетов, которые могут получить фокус, поддерживают табуляцию фокуса. Основными исключениями являются редко используемые виджеты, и случаи, когда имеются несколько "быстрых" клавиш или обработчик ошибок, который перемещает фокус. Например, в диалоге ввода данных может иметься поле, которое необходимо только в одном проценте из всех случаев. В таком диалоге Tab может пропустить это поле, а диалог может использовать один из этих механизмов:
Другое исключение для поддержки Tab - виджеты ввода текста, которые должны поддержать вставку табуляции; почти все текстовые редакторы попадают в этот класс. Qt ведёт себя с Ctrl+Tab как с Tab, а с Ctrl+Shift+Tab - как с Shift+Tab, а такие виджеты могут переопределить QWidget::event() и обработать Tab до вызова QWidget::event(), чтобы подвергнуть обычной обработке все остальные клавиши. Тем не менее, так как некоторые системы используют Ctrl+Tab для других целей, и, как бы то ни было, многие пользователи не знают о Ctrl+Tab, это не является завершённым решением. Пользователь щёлкает мышью в виджетеЭто возможно даже более общепринято, чем нажатие Tab на компьютерах с мышью или другим указательным устройством. Щёлкание мышью для перемещения фокуса является чуть более действенным, чем Tab. Пока он перемещает фокус в виджет, для виджетов редактирования он также перемещает текстовый курсор (внутренний фокус виджета) в место, где щёлкнули мышью. Так как это настолько общепринято и используется людьми, будет хорошим тоном поддержать его в большинстве виджетов. Тем не менее, имеется также важная причина чтобы избегать этого: вы можете не хотеть перемещать фокус из виджета, где он был до этого. Например, когда в текстовом процессоре пользователь щёлкнул по инструментальной кнопке 'B' (полужирный шрифт), что произойдёт с фокусом ввода с клавиатуры? Останется ли он там где был, скорее всего в виджете редактирования, или переместит его на кнопку 'B'? Мы советуем поддержать щелчок для перемещения фокуса в виджетах, которые поддерживают ввод текста, и избегать его в большинстве виджетов, где щелчок мыши имеет другой эффект. (Для кнопок мы также рекомендуем добавить "быструю" клавишу: QAbstractButton и его подклассы делают это очень легко.) В Qt только функция QWidget::setFocusPolicy() оказывает влияние на щелчок для перемещения фокуса. Пользователь нажимает "быструю" клавишуПеремещение фокуса "быстрыми" клавишами не является чем-то необычным. Это может происходить неявно, путём открытия модальных диалогов, но также явно, используя "быстрые" клавиши фокуса, такие как предоставленные QLabel::setBuddy(), QGroupBox и QTabBar. Мы советуем поддерживать "быстрые" клавиши фокуса для всех виджетов, в которые пользователь может захотеть перейти. Например, диалог со вкладками может иметь "быстрые" клавиши для каждой страницы, поэтому пользователь может нажать, например, Alt+P для перехода к странице Printing (Печать). Здесь легко переусердствовать: имеются только несколько клавиш, и важно также предоставить "быстрые" клавиши для команд. Например, Alt+P используется также для Paste, Play, Print, и Print Here в списке Стандартных "быстрых" клавиш. Пользователь вращает колесико мышиВ Microsoft Windows использование колесика мыши всегда обрабатывается виджетом, который владеет фокусом ввода с клавиатуры. В Mac OS X и X11 оно обрабатывается виджетом, который получает другие события мыши. Способ, которым Qt обрабатывает эти различия между платформами, - позволить виджетам переместить фокус ввода с клавиатуры когда используется колесико. С правильной политикой фокуса на каждом виджете приложения могут работать одинаково правильно в Windows, Mac OS X и X11. Пользователь перемещает фокус в данное окноВ этой ситуации приложение должно определить, какой виджет внутри окна получит фокус ввода. Это может быть просто: Если фокус был в этом окне до этого, тогда последний виджет обладавший фокусом получит его снова. Qt делает это автоматически. Если фокус ни разу не был в этом окне до этого и вы знаете, где начнётся фокус, вызовите QWidget::setFocus() на виджете, который получит фокус перед вызовом QWidget::show(). Если вы не сделали это, Qt выберет подходящий виджет. |
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |