2011-09-12 11 views
8

Estoy jugando con algunos gráficos, y he implementado un movimiento simple de la cámara con las teclas de flecha. Mi primer acercamiento fue para anular keyPressEvent a hacer algo como esto:Compruebe si una tecla está abajo con Qt

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

Esto no funciona como yo quiero que lo haría. Cuando presiono y sostengo, por ejemplo, la tecla de avance, la cámara se mueve hacia delante unidades "paso", luego se detiene por un momento y luego continúa moviéndose. Supongo que así es como se genera el evento, para evitar eventos múltiples en caso de una pulsación de tecla algo larga.

Por lo tanto, necesito sondear el teclado en mi rutina Paint(). No he encontrado cómo hacerlo con Qt. Pensé en tener un map<Key, bool> que se actualizaría en keyPressEvent y keyReleaseEvent y sondearía ese mapa en Paint(). Alguna mejor idea? Gracias por cualquier idea.

Respuesta

6

Por lo tanto, necesito sondear el teclado en mi rutina Paint(). No he encontrado cómo hacerlo con Qt. Pensé en tener un mapa que sería actualizarse en keyPressEvent y keyReleaseEvent y sondear ese mapa en Paint().

Su segundo método es lo que yo he hecho, excepto que me gustaría utilizar un evento QTimer continua, periódica para que consulte el mapa del teclado prensado y llamar a la función QWidget :: Update() cuando sea necesario para invalidar el widget pantalla en lugar. Realizar operaciones sin pintura dentro de Paint() se desaconseja por muchas razones, pero no sé cómo explicarlo bien.

+0

Esto es especialmente recomendable, ya que la velocidad de repetición del teclado puede ser configurada por el usuario. Esta es la única forma de garantizar que sea independiente de su tasa de ticks interna. – RedX

+0

Hay un hilo y un ejemplo sobre esto en los foros de qt: http://qt-project.org/forums/viewreply/135346/ – bobbaluba

2

Esto no es sencillo cuando se usa Qt, pero el equipo de Gluon ha estado trabajando exactamente en ese problema (junto con muchos otros). GluonInput resuelve el problema, y ​​está disponible como parte de Gluon: http://gluon.gamingfreedom.org/ También es una buena API similar a Qt, por lo que si bien es una dependencia adicional, debería ser posible usarla.

3

No hay Qt API para comprobar si se pulsa una tecla o no. Puede que tenga que escribir un código separado para diferentes plataformas y agregar un poco de lógica #ifdef.

En Windows, puede utilizar GetKeyState() y GetKeyboardState(), ambas declaradas en windows.h.

Cuestiones relacionadas