Tastaturfokus in Widgets
Qt Widgets behandeln den Tastaturfokus auf eine Weise, die in GUIs üblich geworden ist.
Das Grundproblem besteht darin, dass die Tastenanschläge des Benutzers auf eines von mehreren Fenstern auf dem Bildschirm und auf eines von mehreren Widgets innerhalb des gewünschten Fensters gerichtet sein können. Wenn der Benutzer eine Taste drückt, erwartet er, dass sie an der richtigen Stelle landet, und die Software muss versuchen, diese Erwartung zu erfüllen. Das System muss feststellen, an welche Anwendung der Tastendruck gerichtet ist, welches Fenster innerhalb dieser Anwendung und welches Widget innerhalb dieses Fensters.
Fokus-Bewegung
Die Gewohnheiten, die sich entwickelt haben, um den Tastaturfokus auf ein bestimmtes Widget zu lenken, sind die folgenden:
- Der Benutzer drückt Tab (oder Shift+Tab).
- Der Benutzer klickt auf ein Widget.
- Der Benutzer drückt ein Tastaturkürzel.
- Der Benutzer benutzt das Mausrad.
- Der Benutzer verschiebt den Fokus auf ein Fenster, und die Anwendung muss bestimmen, welches Widget innerhalb des Fensters den Fokus erhalten soll.
Jeder dieser Bewegungsmechanismen ist anders, und verschiedene Arten von Widgets erhalten den Fokus nur bei einigen von ihnen. Wir werden jeden dieser Mechanismen der Reihe nach behandeln.
Tabulator oder Umschalttaste+Tabulator
Das Drücken von Tab ist bei weitem die häufigste Art, den Fokus über die Tastatur zu verschieben. (In Anwendungen zur Dateneingabe funktioniert Enter manchmal genauso wie Tab; dies kann in Qt leicht erreicht werden, indem ein Ereignisfilter implementiert wird.)
Das Drücken von Tab verschiebt in allen heute gebräuchlichen Fenstersystemen den Tastaturfokus zum nächsten Widget in einer kreisförmigen Liste pro Fenster. Tab verschiebt den Fokus entlang der kreisförmigen Liste in die eine Richtung, Shift+Tab in die andere. Die Reihenfolge, in der sich Tab von Widget zu Widget bewegt, wird als Tabulatorreihenfolge bezeichnet.
Sie können die Tabulatorreihenfolge mit QWidget::setTabOrder() anpassen. (Wenn Sie dies nicht tun, verschiebt Tab den Fokus im Allgemeinen in der Reihenfolge der Widgetkonstruktion.) Qt Widgets Designer bietet eine Möglichkeit, die Tabulatorreihenfolge visuell zu ändern.
Da das Drücken von Tab so üblich ist, sollten die meisten Widgets, die den Fokus haben können, den Tabulator-Fokus unterstützen. Die wichtigste Ausnahme sind Widgets, die nur selten verwendet werden und bei denen es einen Tastaturbeschleuniger oder einen Fehlerbehandler gibt, der den Fokus verschiebt.
In einem Dateneingabe-Dialog könnte es zum Beispiel ein Feld geben, das nur in einem Prozent aller Fälle benötigt wird. In einem solchen Dialog könnte Tab dieses Feld auslassen, und der Dialog könnte einen dieser Mechanismen verwenden:
- Wenn das Programm feststellen kann, ob das Feld benötigt wird, kann es den Fokus dorthin verlagern, wenn der Benutzer die Eingabe beendet und OK drückt, oder wenn der Benutzer nach Abschluss der anderen Felder die Eingabetaste drückt. Alternativ können Sie das Feld in die Tabulatorreihenfolge aufnehmen, es aber deaktivieren. Aktivieren Sie es, wenn es in Anbetracht dessen, was der Benutzer in den anderen Feldern eingestellt hat, angebracht ist.
- Die Beschriftung des Feldes kann ein Tastenkürzel enthalten, das den Fokus auf dieses Feld setzt.
Eine weitere Ausnahme von der Tab Unterstützung sind Texteingabe-Widgets, die das Einfügen von Tabs unterstützen müssen; fast alle Texteditoren fallen in diese Klasse. Qt behandelt Ctrl+Tab als Tab und Ctrl+Shift+Tab als Shift+Tab, und solche Widgets können QWidget::event() reimplementieren und Tabulator vor dem Aufruf von QWidget::event() behandeln, um eine normale Verarbeitung aller anderen Tasten zu erhalten. Da jedoch einige Systeme Ctrl+Tab für andere Zwecke verwenden und viele Benutzer Ctrl+Tab ohnehin nicht kennen, ist dies keine vollständige Lösung.
Der Benutzer klickt auf ein Widget
Auf Computern mit einer Maus oder einem anderen Zeigegerät ist dies vielleicht sogar noch häufiger der Fall als das Drücken von Tab.
Klicken, um den Fokus zu verschieben, ist etwas leistungsfähiger als Tab. Während es den Fokus auf ein Widget verschiebt, verschiebt es bei Editor-Widgets auch den Textcursor (den internen Fokus des Widgets) an die Stelle, an der die Maus geklickt wird.
Da es so üblich ist und die Leute daran gewöhnt sind, ist es eine gute Idee, es für die meisten Widgets zu unterstützen. Es gibt jedoch auch einen wichtigen Grund, dies zu vermeiden: Sie möchten möglicherweise den Fokus nicht von dem Widget entfernen, in dem er sich befand.
Wenn der Benutzer beispielsweise in einem Textverarbeitungsprogramm auf die Schaltfläche "B" (fett) klickt, was soll dann mit dem Tastaturfokus geschehen? Soll er dort verbleiben, wo er war, mit ziemlicher Sicherheit im Editier-Widget, oder soll er auf die Schaltfläche "B" wandern?
Wir empfehlen, Click-to-Focus für Widgets zu unterstützen, die Texteingabe unterstützen, und es für die meisten Widgets zu vermeiden, bei denen ein Mausklick einen anderen Effekt hat. (Für Schaltflächen empfehlen wir auch das Hinzufügen eines Tastaturkürzels: QAbstractButton und seine Unterklassen machen dies sehr einfach.)
In Qt wirkt sich nur die Funktion QWidget::setFocusPolicy() auf das Fokussieren aus.
Der Benutzer drückt ein Tastaturkürzel
Es ist nicht ungewöhnlich, dass Tastenkombinationen den Fokus verschieben. Dies kann implizit durch das Öffnen von modalen Dialogen geschehen, aber auch explizit durch Fokusbeschleuniger, wie sie von QLabel::setBuddy(), QGroupBox und QTabBar bereitgestellt werden.
Ihre Anwendung kann den Shortcut-Fokus für alle Widgets unterstützen, zu denen der Benutzer möglicherweise springen möchte. Zum Beispiel kann ein Registerkarten-Dialog über Tastaturkürzel für jede seiner Seiten verfügen, so dass der Benutzer z.B. Alt+P drücken kann, um zur Seite Druckenzu gelangen. Denken Sie daran, dass man es leicht übertreiben kann, da es nur wenige Tasten gibt, und dass es auch wichtig ist, Tastenkombinationen für Befehle bereitzustellen. Beachten Sie die Gestaltungsrichtlinien für die von Ihnen angestrebte Plattform, z. B. die Richtlinien von Microsoft für die Gestaltung von Tastatur-Benutzeroberflächen oder die Richtlinien von Apple für Fokus und Auswahl.
Der Benutzer dreht das Mausrad
Unter Microsoft Windows wird die Verwendung des Mausrads immer von dem Widget übernommen, das den Tastaturfokus hat. Unter macOS und X11 wird es von dem Widget gehandhabt, das andere Mausereignisse erhält.
Qt geht mit diesem Plattformunterschied um, indem es den Widgets erlaubt, den Tastaturfokus zu verschieben, wenn das Mausrad benutzt wird. Mit der richtigen Fokus-Policy für jedes Widget können Anwendungen unter Windows, macOS und X11 idiomatisch korrekt funktionieren.
Der Benutzer verschiebt den Fokus auf dieses Fenster
In dieser Situation muss die Anwendung bestimmen, welches Widget innerhalb des Fensters den Fokus erhalten soll.
Das kann ganz einfach sein: Wenn der Fokus zuvor in diesem Fenster war, dann sollte das letzte Widget, das den Fokus hatte, diesen wieder erhalten. Qt macht dies automatisch.
Wenn der Fokus noch nie in diesem Fenster war und Sie wissen, wo der Fokus beginnen soll, rufen Sie QWidget::setFocus() für das Widget auf, das den Fokus erhalten soll, bevor Sie QWidget::show() aufrufen. Andernfalls wird Qt ein passendes Widget auswählen.
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.