2012-10-11 18 views
7

voglio gestire Ctrl + Tab e Ctrl + Shift + Tab al fine di passare da una scheda nella mia domanda ("avanti" e "indietro", rispettivamente, i due eventi chiave). Tuttavia, questo non sembra funzionare come previsto.Gestire eventi chiave Ctrl + Tab e Ctrl + Shift + Tab

Questo è il mio codice corrente (esempio minimo):

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') 
      } 
     } 
    } 
} 

ho eseguito questo pezzo di codice con qmlviewer (versione Qt 4.8.2)

uscita quando si preme Ctrl + Tab:

forward 
forward 

Uscita quando si preme Ctrl + Shift + Tab:

nessuno

Così vedo due errori: L'ex sequenza di tasti viene gestito due volte mentre l'altro non a tutti.

  • EDIT: La ragione per cui l'altro non viene gestita a tutto è risolto, vedere i commenti.

Perché questo succede e come posso risolvere questo?

Nota: utilizzo già Qt Components per Desktop nella mia applicazione, quindi è OK se si conosce una soluzione che richiede questo modulo.

+2

Ok, suppongo che il problema sia che Qt mappa 'Shift' + 'Tab' su' Qt :: Key_Backtab' invece di 'Qt :: Key_Tab'. Questo risolve il secondo problema, ma non il problema che gli eventi dei tasti sono ricevuti * due volte *. – leemes

risposta

7

Devi accettare l'evento, altrimenti l'evento viene propagato ai genitori fino a quando non viene accettato. Il seguente codice ha funzionato per me.

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; 
      } 
     } 
    } 
} 

Edit: Questo comportamento consente ai genitori di gestire gli eventi che il bambino non poteva, per cose come tasti di scelta rapida.

Spero che questo aiuti!

+1

Si ha un errore nel codice, 'event.modifiers && Qt.ControlModifier' dovrebbe essere' event.modifiers == Qt.ControlModifier'. In caso contrario, i secondi eventi chiave funzioneranno in combinazione con qualsiasi 'event.modifiers' – Jaruba

Problemi correlati