2012-10-11 39 views
7

quiero manejar los dos eventos clave Ctrl + Tab y Ctrl + Shift + Tab con el fin de cambiar entre pestañas en mi solicitud ("adelante" y "atrás", respectivamente) Sin embargo, esto no parece funcionar como se esperaba.Manejar eventos de teclas Ctrl + Tab y Ctrl + Shift + Tab

Este es mi código actual (mínima ejemplo):

import QtQuick 1.1 

Item { 
    width: 100 
    height: 100 

    focus: true 

    Keys.onPressed: { 
     if(event.modifiers & Qt.ControlModifier) { 
      if(event.key === Qt.Key_Tab) { 
       if(event.modifiers & Qt.ShiftModifier) 
        console.log('backward') 
       else 
        console.log('forward') 
      } 
     } 
    } 
} 

me encontré con este pedazo de código con qmlviewer (versión Qt 4.8.2)

salida al pulsar Ctrl + Tab:

forward 
forward 

Salida al presionar Ctrl + Shift + Tab:

ninguno

Así que ver dos errores: La primera secuencia de teclas se maneja en dos ocasiones, mientras que el otro no en todos.

  • EDIT: La razón de que el otro no consigue manipularse en todo se resuelve, ver los comentarios.

¿Por qué sucede esto y cómo puedo solucionar esto?

Nota: Ya uso Qt Components for Desktop en mi aplicación, por lo que está bien si conoce una solución que requiera este módulo.

+2

Ok, supongo que el problema es que Qt ya asigna 'Shift' +' Tab' a 'Qt :: Key_Backtab' en lugar de' Qt :: Key_Tab'. Esto resuelve el segundo problema, pero no el problema de que los eventos clave se reciben * dos veces *. – leemes

Respuesta

7

Tienes que aceptar el evento, de lo contrario, el evento se propaga a los padres hasta que sea aceptado. El siguiente código funcionó para mí.

Item { 
    width: 100 
    height: 100 

    focus: true 

    Keys.onPressed: { 
     if(event.modifiers && Qt.ControlModifier) { 
      if(event.key === Qt.Key_Tab) { 
       console.log('forward') 
       event.accepted = true; 
      } 
      else if(event.key === Qt.Key_Backtab) { 
       console.log('backward') 
       event.accepted = true; 
      } 
     } 
    } 
} 

Editar: Este comportamiento permite a los padres controlar eventos que el niño no podría, por cosas como teclas de acceso rápido.

Espero que esto ayude!

+1

Tiene un error en su código, 'event.modifiers && Qt.ControlModifier' debe ser' event.modifiers == Qt.ControlModifier'. De lo contrario, los segundos eventos clave funcionarán en combinación con cualquier 'event.modifiers' – Jaruba

Cuestiones relacionadas