Keyboard Focus Overview Qt's widgets handle keyboard focus in the ways that have become
customary in GUIs.
The basic issue is that the user's keystrokes can be directed at any
of several windows on the screen, and any of several widgets inside
the intended window. When the user presses a key, they expect it to go
to the right place, and the software must try to meet this
expectation. The system must determine which application the keystroke
is directed at, which window within that application, and which widget
within that window.
The customs which have evolved for directing keyboard focus to a
particular widget are these:
Each of these motion mechanisms is different, and different types of
widgets receive focus in only some of them. We'll cover each of them
in turn.
Pressing Tab is by far the most common way to move focus using the
keyboard. Sometimes in data-entry applications Enter does the same as
Tab. We will ignore that for the moment.
Pressing Tab, in all window systems in common use today, moves the
keyboard focus to the next widget in a circular per-window list. Tab
moves focus along the circular list in one direction, Shift+Tab in the
other. The order in which Tab presses move from widget to widget is
called the tab order.
In Qt, this list is kept in the QFocusData class. There is one
QFocusData object per window, and widgets automatically append
themselves to the end of it when QWidget::setFocusPolicy() is
called with an appropriate QWidget::FocusPolicy. You can customize
the tab order using QWidget::setTabOrder(). (If you don't, Tab
generally moves focus in the order of widget construction.) Qt Designer provides a means of visually
changing the tab order.
Since pressing Tab is so common, most widgets that can have focus
should support tab focus. The major exception is widgets that are
rarely used, and where there is some keyboard accelerator or error
handler that moves the focus.
For example, in a data entry dialog, there might be a field that is
only necessary in one per cent of all cases. In such a dialog, Tab
could skip this field, and the dialog could use one of these
mechanisms:
Another exception to Tab support is text-entry widgets that must
support the insertion of tabs; almost all text editors fall into this
class. Qt treats Control+Tab as Tab and Control+Shift+Tab as
Shift+Tab, and such widgets can reimplement QWidget::event() and
handle Tab before calling QWidget::event() to get normal processing of
all other keys. However, since some systems use Control+Tab for other
purposes, and many users aren't aware of Control+Tab anyway, this
isn't a complete solution.
This is perhaps even more common than pressing Tab on computers with a
mouse or other pointing device.
Clicking to move the focus is slightly more powerful than Tab. While
it moves the focus to a widget, for editor widgets it also moves
the text cursor (the widget's internal focus) to the spot where the
mouse is clicked.
Since it is so common and people are used to it, it's a good idea to
support it for most widgets. However, there is also an important
reason to avoid it: you may not want to remove focus from the widget
where it was.
For example, in a word processor, when the user clicks the 'B' (bold)
tool button, what should happen to the keyboard focus? Should it
remain where it was, almost certainly in the editing widget, or should
it move to the 'B' button?
We advise supporting click-to-focus for widgets that support text
entry, and to avoid it for most widgets where a mouse click has a
different effect. (For buttons, we also recommend adding a keyboard
shortcut: QButton and its subclasses make this very easy.)
In Qt, only the QWidget::setFocusPolicy() function affects
click-to-focus.
It's not unusual for keyboard shortcuts to move the focus. This can
happen implicitly by opening modal dialogs, but also explicitly using
focus accelerators such as those provided by QLabel::setBuddy(), QGroupBox and QTabBar.
We advise supporting shortcut focus for all widgets that the user may
want to jump to. For example, a tab dialog can have keyboard shortcuts
for each of its pages, so the user can press e.g. Alt+P to step to the
Printing page. But don't overdo this: there are only a few
keys, and it's also important to provide keyboard shortcuts for
commands. Alt+P is also used for Paste, Play, Print and Print Here in
the standard list of shortcuts, for
example.
On Microsoft Windows, mouse wheel usage is always handled by the
widget that has keyboard focus. On Mac OS X and X11, it's handled by
the widget that gets other mouse events.
The way Qt handles this platform difference is by letting widgets move
the keyboard focus when the wheel is used. With the right focus policy
on each widget, applications can work idiomatically correctly on
Windows, Mac OS X, and X11.
In this situation the application must determine which widget within
the window should receive the focus.
This can be simple: if the focus has been in this window before, then
the last widget to have focus should regain it. Qt does this
automatically.
If focus has never been in this window before and you know where focus
should start out, call QWidget::setFocus() on the widget which
should receive focus before you QWidget::show() it. If you don't,
Qt will pick a suitable widget.
|
Publicité
Best OfActualités les plus luesSemaine
Mois
Année
Le Qt Labs au hasardUtiliser OpenCL avec QtLes Qt Labs sont les laboratoires des développeurs de Qt, où ils peuvent partager des impressions sur le framework, son utilisation, ce que pourrait être son futur. Lire l'article.
CommunautéRessources
Liens utilesContact
Qt dans le magazine |
Cette page est une traduction d'une page de la documentation de Qt, écrite par Nokia Corporation and/or its subsidiary(-ies). Les éventuels problèmes résultant d'une mauvaise traduction ne sont pas imputables à Nokia. | Qt 3.2 | |
Copyright © 2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon, vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD. | ||
Vous avez déniché une erreur ? Un bug ? Une redirection cassée ? Ou tout autre problème, quel qu'il soit ? Ou bien vous désirez participer à ce projet de traduction ? N'hésitez pas à nous contacter ou par MP ! |
Copyright © 2000-2012 - www.developpez.com