2011-09-12 12 views
8

Sto giocando con alcuni elementi grafici e ho implementato il semplice movimento della fotocamera con i tasti freccia. Il mio primo approccio è stato quello di ignorare keyPressEvent a fare qualcosa di simile:Verifica se una chiave non è attiva con Qt

switch(key) 
{ 
    case up: MoveCameraForward(step); break; 
    case left: MoveCameraLeft(step); break; 
    ... 
} 

Questo non funziona come vorrei che avrebbe fatto. Quando premo e tengo premuto, ad esempio, il tasto avanti, la telecamera avanza unità "step", quindi si blocca per un po 'e poi continua a muoversi. Sto indovinando che questo è il modo in cui l'evento viene generato, al fine di evitare più eventi in caso di un breve pressione del tasto.

Quindi, ho bisogno di eseguire il polling della tastiera nella mia routine Paint(). Non ho trovato come farlo con Qt. Ho pensato di avere uno map<Key, bool> che sarebbe stato aggiornato in keyPressEvent e keyReleaseEvent e il polling di quella mappa in Paint(). Qualche idea migliore? Grazie per eventuali approfondimenti.

risposta

6

Quindi, ho bisogno di eseguire il polling della tastiera nella mia routine Paint(). Non ho trovato come farlo con Qt. Ho pensato di avere una mappa che avrebbe aggiornato in keyPressEvent e keyReleaseEvent e polling quella mappa in Paint().

Il secondo metodo è quello che avrei fatto, se non che avrei usato un continuo, evento periodico QTimer per interrogare la mappa della tastiera pressato e chiamare la funzione QWidget :: Update() quando è necessario per invalidare il widget di visualizzazione anziché. Eseguire operazioni di non pittura all'interno di Paint() è fortemente scoraggiato per molte ragioni, ma non so come spiegarlo bene.

+0

Ciò è particolarmente consigliato poiché la velocità di ripetizione della tastiera può essere impostata dall'utente. Questo è l'unico modo per garantire che sia indipendente dalla frequenza di tick interna. – RedX

+0

C'è una discussione e un esempio su questo nei forum qt: http://qt-project.org/forums/viewreply/135346/ – bobbaluba

2

Questo non è semplice quando si utilizza Qt, ma il team di Gluon ha lavorato esattamente su questo problema (insieme a un gruppo di altri). GluonInput risolve il problema, ed è disponibile come parte di Gluon: http://gluon.gamingfreedom.org/ È anche una bella API simile a Qt, quindi mentre è una dipendenza extra, dovrebbe essere possibile usarla.

3

Non esiste alcuna API Qt per verificare se un tasto è premuto o meno. Potrebbe essere necessario scrivere codice separato per piattaforme diverse e aggiungere un po 'di logica #ifdef.

Su Windows è possibile utilizzare GetKeyState() e GetKeyboardState(), sia dichiarata in windows.h.

Problemi correlati