Enfoque de Teclado en Widgets
Los widgets de Qt manejan el foco del teclado de formas que se han convertido en habituales en las GUIs.
La cuestión básica es que las pulsaciones de teclado del usuario pueden dirigirse a cualquiera de las ventanas de la pantalla, y a cualquiera de los widgets dentro de la ventana deseada. Cuando el usuario pulsa una tecla, espera que vaya al lugar correcto, y el software debe intentar cumplir esta expectativa. El sistema debe determinar a qué aplicación se dirige la pulsación de la tecla, qué ventana dentro de esa aplicación y qué widget dentro de esa ventana.
Movimiento del foco
Las costumbres que han evolucionado para dirigir el foco del teclado a un widget concreto son éstas:
- El usuario pulsa Tab (o Shift+Tab).
- El usuario hace clic en un widget.
- El usuario pulsa un atajo de teclado.
- El usuario utiliza la rueda del ratón.
- El usuario mueve el foco a una ventana, y la aplicación debe determinar qué widget dentro de la ventana debe obtener el foco.
Cada uno de estos mecanismos de movimiento es diferente, y diferentes tipos de widgets reciben el foco sólo en algunos de ellos. Cubriremos cada uno de ellos sucesivamente.
Tabulador o Mayús+Tabulador
Pulsar Tab es, con diferencia, la forma más común de mover el foco mediante el teclado. (A veces en aplicaciones de entrada de datos Enter hace lo mismo que Tab; esto se puede conseguir fácilmente en Qt implementando un filtro de eventos).
Pulsar Tab, en todos los sistemas de ventanas de uso común hoy en día, mueve el foco del teclado al siguiente widget en una lista circular por ventana. Tab mueve el foco a lo largo de la lista circular en una dirección, Shift+Tab en la otra. El orden en que las pulsaciones de Tab se mueven de un widget a otro se denomina orden de tabulación.
Puedes personalizar el orden de tabulación utilizando QWidget::setTabOrder(). (Si no lo haces, Tab generalmente mueve el foco en el orden de construcción del widget.) Qt Widgets Designer proporciona un medio para cambiar visualmente el orden de tabulación.
Como pulsar Tab es tan común, la mayoría de los widgets que pueden tener foco deberían soportar el foco de pestaña. La mayor excepción son los widgets que se usan raramente, y donde hay algún acelerador de teclado o manejador de errores que mueve el foco.
Por ejemplo, en un cuadro de diálogo de introducción de datos, puede haber un campo que sólo sea necesario en el uno por ciento de los casos. En un diálogo de este tipo, Tab podría omitir este campo, y el diálogo podría utilizar uno de estos mecanismos:
- Si el programa puede determinar si el campo es necesario, puede mover el foco allí cuando el usuario finaliza la entrada y pulsa OK, o cuando el usuario pulsa Intro después de finalizar los otros campos. Otra posibilidad es incluir el campo en el orden de tabulación pero desactivarlo. Habilítelo si resulta apropiado a la vista de lo que el usuario ha establecido en los otros campos.
- La etiqueta del campo puede incluir un atajo de teclado que mueva el foco a este campo.
Otra excepción al soporte de Tab son los widgets de entrada de texto que deben soportar la inserción de tabuladores; casi todos los editores de texto entran en esta clase. Qt trata Ctrl+Tab como Tab y Ctrl+Shift+Tab como Shift+Tab, y tales widgets pueden reimplementar QWidget::event() y manejar Tab antes de llamar a QWidget::event() para obtener un procesamiento normal de todas las demás teclas. Sin embargo, como algunos sistemas utilizan Ctrl+Tab para otros propósitos, y muchos usuarios no son conscientes de Ctrl+Tab de todos modos, esto no es una solución completa.
El usuario hace clic en un widget
Esto es quizás incluso más común que pulsar Tab en ordenadores con ratón u otro dispositivo señalador.
Hacer clic para mover el foco es ligeramente más potente que Tab. Aunque mueve el foco a un widget, para los widgets del editor también mueve el cursor de texto (el foco interno del widget) al lugar donde se hace clic con el ratón.
Dado que es tan común y la gente está acostumbrada a ello, es una buena idea soportarlo para la mayoría de los widgets. Sin embargo, también hay una razón importante para evitarlo: puede que no quieras quitar el foco del widget donde estaba.
Por ejemplo, en un procesador de textos, cuando el usuario pulsa el botón de la herramienta "B" (negrita), ¿qué debería pasar con el foco del teclado? ¿Debe permanecer donde estaba, casi con toda seguridad en el widget de edición, o debe desplazarse al botón "B"?
Aconsejamos apoyar el clic para enfocar en los widgets que admiten la entrada de texto, y evitarlo en la mayoría de los widgets en los que un clic del ratón tiene un efecto diferente. (Para los botones, también recomendamos añadir un atajo de teclado: QAbstractButton y sus subclases lo hacen muy fácil).
En Qt, sólo la función QWidget::setFocusPolicy() afecta al click-to-focus.
El usuario pulsa un atajo de teclado
No es inusual que los atajos de teclado muevan el foco. Esto puede ocurrir implícitamente abriendo diálogos modales, pero también explícitamente usando aceleradores de foco como los proporcionados por QLabel::setBuddy(), QGroupBox, y QTabBar.
Tu aplicación puede soportar accesos directos de foco para todos los widgets a los que el usuario quiera saltar. Por ejemplo, un cuadro de diálogo de pestañas puede tener atajos de teclado para cada una de sus páginas, de modo que el usuario pueda pulsar, por ejemplo, Alt+P para pasar a la página de impresión. Tenga en cuenta que es fácil exagerar, ya que sólo hay unas pocas teclas, y que también es importante proporcionar atajos de teclado para los comandos. Consulte las directrices de diseño de la plataforma a la que se dirija, por ejemplo, las directrices de Microsoft para el diseño de interfaces de usuario con teclado o las directrices de enfoque y selección de Apple.
El usuario gira la rueda del ratón
En Microsoft Windows, el uso de la rueda del ratón siempre es gestionado por el widget que tiene el foco del teclado. En macOS y X11, es manejado por el widget que recibe otros eventos de ratón.
La forma en que Qt maneja esta diferencia de plataforma es permitiendo que los widgets muevan el foco del teclado cuando se usa la rueda. Con la política de foco adecuada en cada widget, las aplicaciones pueden funcionar idiomáticamente de forma correcta en Windows, macOS y X11.
El usuario mueve el foco a esta ventana
En esta situación, la aplicación debe determinar qué widget dentro de la ventana debe recibir el foco.
Esto puede ser sencillo: Si el foco ha estado antes en esta ventana, entonces el último widget que tuvo el foco debería recuperarlo. Qt lo hace automáticamente.
Si el foco nunca ha estado antes en esta ventana y sabes dónde debería empezar el foco, llama a QWidget::setFocus() en el widget que debería recibir el foco antes de llamar a QWidget::show() en él. Si no, Qt elegirá un widget adecuado.
© 2026 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.