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:

usuario presiona y mantieneCtrlusuario presiona y mantieneArribalanzamientos de usuarioCtrl yArriba simultaneamente

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.

Respuestas a la pregunta(2)

Su respuesta a la pregunta