trucos tips teclas teclado tecla secretos ocultas laptop funciones con computadora atajos qt keyboard keyboard-events

tips - Captura de versiones de tecla modificadora de Qt



trucos de teclado de computadora (2)

Soy un recién llegado a Qt, pero estoy tratando de implementar lo que básicamente equivale a un loop de entrada de videojuego en una aplicación Qt (loco, lo sé, pero ve si puedes ayudar). Necesito un manejo de eventos preciso y uno a uno para las pulsaciones de teclas y las teclas, para todas las teclas, incluidos los modificadores, sin importar qué tan extrañamente toque el teclado.

Por supuesto, su acceso principal a eventos clave es a través de QKeyEvent . Pero digamos que sucede lo siguiente:

  • el usuario presiona y sostiene Ctrl
  • el usuario presiona y levanta
  • el usuario suelta Ctrl y Arriba simultáneamente

Por lo que puedo decir, lo que recibo de Qt es:

  • QKeyEvent para presionar Ctrl , solo ( Qt::Key_Ctrl )
  • QKeyEvent para presionar Arriba , por sí mismo ( Qt::Key_Up )
  • QKeyEvent para la liberación de Ctrl + Arriba , con la key() == Qt::Key_Up y el bit Ctrl reflejado en un cambio de modificador.

Esto puede no ser exactamente exacto, pero es mi mejor suposición acerca de lo que está ocurriendo de la depuración demasiado del problema. En cualquier caso, los eventos clave de lanzamiento cuando los modificadores están involucrados son increíblemente poco confiables.

La secuencia Ctrl + Up allí al final es el problema. Ahora, sé que estoy obteniendo el estado de modificador en e->modifiers() , y estoy recibiendo la tecla presionada en e->key() . Podría hacer algunos hacks complicados, tratando de recordar el estado del modificador internamente, para detectar cuándo el usuario ha liberado el modificador. Pero entonces, los documentos de Qt me informan, hablando de e->modifiers() , que:

Esta función no siempre es confiable. El usuario puede confundirlo presionando ambas teclas Shift simultáneamente y soltando una de ellas, por ejemplo.

Este es exactamente el caso que trato de evitar.

¿Hay alguna forma confiable de realizar un seguimiento de las pulsaciones y liberaciones de teclas uno a uno, tanto para las teclas normales como las de modificación, en Qt? Si no, ¿qué es lo más cercano que puede obtener?

EDITAR: Puedo refinar esto un poco. Parece que si mantienes presionado Cmd en una Mac, presiona unas pocas teclas (letras, por ejemplo), libéralas, luego suelta Cmd , no obtienes eventos de lanzamiento para los comunicados clave de letras. Voy a tratar de aislar un pequeño ejemplo y ver si esto es realmente un error Qt.


Creo que si te estás volviendo muy específico con el teclado, vas a tener que dejar Qt y obtener algo que sea específico del sistema operativo, o que necesites manejar los eventos Qt antes de que ocurra cualquier filtrado.

Administrar eventos de Qt antes de filtrar

Los aceleradores en Qt buscan y esperan combinaciones Alt + __ y puedes configurar combinaciones Ctrl + __ para ser escuchadas por QAction.

Ambos tipos de Objetos integrados en QApplication y el entorno general de la GUI podrían estar interrumpiendo los mensajes que recibes y ofreciéndote menos de lo que estás esperando.

Qt Documentation: El sistema de eventos ... esta parte tiene un enlace a esto ...

QCoreApplication :: notify () ... que le dice al nivel más alto que una aplicación Qt se puede escribir para manejar la entrada usando la API de Qt:

Instalar un filtro de eventos en QCoreApplication::instance() . Tal filtro de eventos puede procesar todos los eventos para todos los widgets, por lo que es tan poderoso como volver a implementar notify (); Además, es posible tener más de una aplicación: filtro de eventos global. Los filtros de eventos globales incluso ven eventos de mouse para widgets deshabilitados. Tenga en cuenta que los filtros de evento de aplicación solo se invocan para objetos que residen en el hilo principal.

Alternativa de manejo de teclado específico OS

Si observa las declaraciones de depuración de un filtro de eventos Qt instalado en el nivel mencionado anteriormente produce los mismos resultados que mencionó en su pregunta, entonces tendrá que ir al material de entrada del teclado específico del sistema operativo. Por ejemplo, en Windows necesitaría escanear el teclado y / o mirar el estado VK de todo el teclado y hacer algo con él (con algo como GetKeyboardState() ).


Sé que es un poco tarde para responder esta pregunta. Aún así ... tengo el mismo problema con los eventos de lanzamiento de tecla Mac y hay un error abierto QTBUG-36839. En Windows, puede implementar el gancho del teclado para capturar todas las pulsaciones / liberaciones de teclas. Pero incluso eso no es confiable en algunos casos. Por ejemplo, si escribe un atajo de pantalla de bloqueo después de desbloquear, NO verá ninguna liberación de tecla. Supongo que debe haber algo similar a engancharse a Mac. Si es importante para ti recordar qué presionó exactamente la tecla física del usuario, creo que esta es una de las mejores maneras. Al mismo tiempo, desde mi experiencia, hacer algo de bajo nivel lleva mucho tiempo y puede traer errores extraños en casos que nunca podrías imaginar. Entonces la pregunta es: ¿estás seguro de que no puedes hacer lo que necesitas con algo como QAction? O tal vez podrías usar Control en lugar de Comando en tus accesos directos :)