¿Cómo deshabilito el comportamiento de Qt en Linux de capturar las teclas de flecha para la navegación de foco de widget?

Estoy trabajando en una aplicación Qt que se desarrolla principalmente en MacOS, pero que también se construye y prueba en Linux.

Definimos un método keyPressEvent () en nuestra clase de ventana principal para responder a ciertos eventos de teclado. Entre otros, respondemos a Qt :: Key_Left, Qt :: Key_Right y Qt :: Key_Space. Esto funciona muy bien en MacOS. En Linux, sin embargo, nunca tenemos estos eventos.

Al hacer algunas búsquedas en Google (y confirmarlo con el comportamiento de nuestra aplicación en Linux), parece que la razón de esto es que Qt usa estas teclas para la navegación por el teclado de los widgets de botón en la GUI de la aplicación. Si presiono las teclas de flecha en Linux, recorro todos los widgets de los botones activos, seleccionando cada uno en turno. Si hago clic en la barra espaciadora, se presiona el botón seleccionado actualmente.

Todo lo que he podido encontrar hasta ahora en Google es sugerencias sobre cómo subclasificar o aplicar filtros a botones específicos para evitar este comportamiento haciendo que el botón ignore el evento y lo transmita. Pero no quiero tener que hacer esto para cada widget de botón que he puesto en mi GUI. Eso es simplemente cojo.

¿Hay alguna manera de deshabilitar este comportamiento globalmente y permitir que el código de mi aplicación obtenga TODOS los eventos de la tecla de flecha y la barra espaciadora?

Mejor respuesta
Puede configurar agregar un detector de eventos global para capturar estos eventos.

En el constructor de ventanas:

QApplication::instance()->installEventFilter(this);

En el método eventFilter de la ventana:

bool MainWindow::eventFilter(QObject *object, QEvent *event) {
  if (event->type() == QEvent::KeyPress) {
    QKeyEvent* key_event = static_cast<QKeyEvent*>(event);
    qDebug() << "key" << key_event->key() << "object" << object;
    //...
  }
  return false;
}

Si ha procesado un evento, debe devolver verdadero de esta función. Puede utilizar la variable de objeto para averiguar la fuente del evento. Por ejemplo, puede ser algún QPushButton. Puede verificar si este botón es secundario de su ventana principal si es necesario (si tiene varias ventanas superiores).

Otra forma es desactivar completamente el enfoque de los botones. Establezca los botones ‘focusPolicy en NoFocus. Entonces no captarán eventos clave.

También puede subclase QPushButton y volver a implementar keyPressEvent con implementación vacía.

Por favor indique la dirección original:¿Cómo deshabilito el comportamiento de Qt en Linux de capturar las teclas de flecha para la navegación de foco de widget? - Código de registro