Клавиатурное управление диалоговыми окнами GUI - Должна ли кнопка по умолчанию меняться с фокусом? - PullRequest
2 голосов
/ 15 июля 2011

В диалоговых окнах GUI большинство приложений обеспечивают управление с клавиатуры следующим образом:

  1. Клавиша ввода - нажимает кнопку по умолчанию.(Значение по умолчанию обычно обозначается полужирной рамкой кнопки.)
  2. Клавиша Esc - нажимает кнопку отмены или закрытия.
  3. Клавиша пробела - нажимает виджет, который в настоящее время имеет фокус клавиатуры.
  4. Клавиша табуляции - перемещает фокус к следующему виджету.

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

Я вижу некоторые проблемы с этим поведением:

  1. Шум отображения перерисовывающих кнопок, чтобы отменить выделение оригинальной кнопки по умолчанию и перебросить кнопку под фокусом как новое значение по умолчанию.
  2. Клавиша пробела теперь несколько избыточна с клавишей Enter.
  3. Нет ускорителя клавиатуры, чтобы получить обычную кнопку по умолчанию (обычно кнопка ОК).

Однако, похоже,тенденция была в этом направлении, чтобы изменить кнопку по умолчанию с изменением фокуса на другую кнопку.Чем обоснован этот отход от ранних графических интерфейсов?Казалось бы, он обеспечивает меньшую функциональность, поскольку нет способа нажать кнопку по умолчанию.Люди находили, что оригинальная модель была слишком сложной для пользователей, чтобы понять?Я бы подумал, что управление диалогами с помощью клавиатуры будет задачей для опытных пользователей, которые не будут иметь проблем с пониманием модели и предпочитают иметь ускоритель для текущей кнопки (пробел) и исходную кнопку по умолчанию (ввод) всегда.

Обратите внимание, что Qt for one поддерживает изменение: свойство autoDefault QPushButton отвечает за поведение изменения кнопки по умолчанию.По умолчанию его значение равно true.Поэтому вы должны предпринять дополнительные действия, чтобы установить значение false для всех кнопок, чтобы они не становились кнопками по умолчанию при фокусировке.

Ответы [ 2 ]

3 голосов
/ 15 июля 2011

Это , а не"отклонение от ранних графических интерфейсов", по крайней мере, если под "ранними графическими интерфейсами" вы подразумеваете Windows 1.0.Поведение, которое вы описываете, было таким с самого начала.

Сфокусированная кнопка всегда"нажата" при нажатии клавиши Enter .Кнопка по умолчанию срабатывает только в следующих двух ситуациях:

  • Кнопка по умолчанию имеет фокус (что она делает по умолчанию), или
  • Фокус находится на элементе управления, который делаетне обрабатывается Ввод нажатий клавиш (например, статического элемента управления или однострочного текстового поля, для которого не установлен флаг стиля ES_WANTRETURN).

Знаменитый блоггер Win32У Раймонда Чена есть пост, объясняющий это поведение (особое внимание уделено двум последним цитируемым абзацам):

Диалоговое окно поддерживает концепцию «кнопки по умолчанию» (которая всегдакнопка).Кнопка по умолчанию, как правило, нарисована с характерным внешним видом (жирный контур или другой цвет) и указывает, какое действие предпримет диалоговое окно, когда вы нажмете Enter.Обратите внимание, что это не то же самое, что элемент управления с фокусом.

Например, откройте диалоговое окно «Выполнить» из меню «Пуск».Обратите внимание, что кнопка OK является кнопкой по умолчанию;он отличается от других кнопок.Но основное внимание уделяется контролю редактирования.Ваш ввод идет в элемент управления редактирования, пока вы не нажмете Enter;Ввод активирует кнопку по умолчанию, которая в порядке.

По мере перехода по диалоговому окну наблюдайте, что происходит с кнопкой по умолчанию.Когда диалоговое окно перемещает фокус на кнопку, эта кнопка становится новой кнопкой по умолчанию.Но когда диалоговое окно перемещает фокус на что-то, что вообще не является кнопкой, кнопка OK возобновляет свое положение в качестве кнопки по умолчанию.

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

0 голосов
/ 15 июля 2011

Я ожидал бы поведения:

  1. Если я нажимаю клавишу ввода, когда окно просто всплывает, следует нажать кнопку по умолчанию
  2. Если я нажимаю клавишу Tab, я начинаю навигацию по виджетам. В этом случае есть два варианта:

2.1 Я нажимаю ввод - это событие должно быть доставлено в фокусированный виджет. Нет необходимости менять кнопку по умолчанию - просто перенаправьте событие в фокусированный виджет.

2.2 Я нажимаю клавишу escape. В этом случае все должно вернуться в состояние после создания окна.

Примечания:

  • Я из смешанного фона - я не знаю, узнал ли я это в Windows, Linux или мобильных ОС! Это то, как я ожидаю, что все получится.
  • Я не использую пробел (не знал, что это такое)
...