Capturando lanzamientos de la tecla modificadora Qt
Soy un recién llegado a Qt, pero estoy tratando de implementar lo que básicamente equivale a un bucle de entrada similar a un juego de video en una aplicación Qt (es una locura, lo sé, pero vea si puede ayudar). Necesito un manejo de eventos uno a uno preciso para presionar teclasy lanzamientos de teclas, para todas las teclas, incluidos los modificadores, sin importar qué tan raro sea el acorde del teclado.
Por supuesto, su acceso principal a eventos clave es a través deQKeyEvent
. Pero digamos que sucede lo siguiente:
Por lo que puedo decir, lo que obtengo de Qt es:
QKeyEvent para el prensado deCtrl, por sí mismo (Qt::Key_Ctrl
)QKeyEvent para el prensado deArriba, por sí mismo (Qt::Key_Up
)QKeyEvent para la liberación deCtrl + Arriba, conkey() == Qt::Key_Up
y el bit Ctrl se refleja en un cambio de modificador.Es posible que esto no sea exactamente exacto, pero es mi mejor estimación de lo que está sucediendo a partir de una excesiva depuración del problema. En cualquier caso, la clave.lanzamiento Los eventos cuando se involucran modificadores sonincreíblemente no fidedigno.
La secuencia Ctrl + Up al final es el problema. Ahora, sé que estoy recibiendo el estado modificador ene->modifiers()
, y me estoy presionando la teclae->key()
. Podría hacer algunos trucos complicados, intentando recordar el estado del modificador internamente, para detectar cuándo el usuario soltó el modificador. Pero entonces, los documentos Qt me informan, hablando dee->modifiers()
, ese:
Esta función no siempre se puede confiar. El usuario puede confundirlo presionando ambas teclas Shift simultáneamente y soltando una de ellas, por ejemplo.
Este es exactamente el caso que estoy tratando deevitar.
¿Hay alguna forma confiable de realizar un seguimiento de las pulsaciones y lanzamientos de teclas uno a uno, tanto en las teclas normales como en las teclas modificadoras, en Qt? Si no, ¿qué es lo más cercano que puedes conseguir?
EDITAR: Puedo refinar esto un poco. Parece que si mantienes presionadoCmd en una Mac, presione algunas teclas (teclas de letras, digamos), suéltelos y luego suéltelosCmd, túNo consiga los eventos de lanzamiento para los lanzamientos de letras clave. Voy a tratar de aislar un pequeño ejemplo y ver si esto es realmente un error de Qt.