2012-04-30 11 views
8

Estoy en una situación en la que estoy tratando de leer en un archivo de configuración JSON que dicta qué comandos de teclado se asignan a acciones determinadas. Por ejemplo:QKeySequence to QKeyEvent

... 
{ 
    "Action": "Quit", 
    "Combo" : "CTRL+Q" 
}, 
... 

La construcción de un QKeySequence de la etiqueta de combo es trivial, pero tengo que vigilar QKeyEvent s con el fin de activar acciones. Tenga en cuenta que I tiene para monitorear QKeyEvent s porque también se utilizan para otros fines en la aplicación. es decir, no sería aceptable controlar solo los comandos de teclado para QKeySequence s (si eso es posible).

corto de escribir un analizador personalizado para construir un objeto QKeyEvent para cada etiqueta "Combo", hay alguna forma de comparar una a un QKeySequence? Por ejemplo:

QKeyEvent KeyCommandsHandler::toKeyEvent(QKeySequence sequence) { 
    //somehow convert to QKeyEvent 
} 
+0

Para que quede claro, el uso de QAction :: setShortcut ¿no hará lo que quiera? – Anthony

Respuesta

3

En general, no se puede comparar QKeyEvent y QKeySequence objetos. QKeyEvent representa el evento de una sola tecla presionando o soltando la tecla, mientras que un QKeySequence puede contener una secuencia de hasta cuatro claves, cada una con información de modificador opcional.

Puede, sin embargo, comparar los objetos si está seguro de que sus secuencias de teclas siempre contendrán una sola clave:

bool isEquiv(const QKeyEvent& event, const QKeySequence& seq) 
{ 
    if (seq.count() != 1) 
     return false; 
    return seq[0] == (event.key() | event.modifiers()); 
} 

Puede incluso escribir una función de conversión de QKeyEvent a QKeySequence:

QKeySequence toKeySequence(const QKeyEvent& event) 
{ 
    return QKeySequence(event.key() | event.modifiers()); 
} 

Tenga en cuenta que no tiene sentido convertir un QKeySequence en un QKeyEvent, sin embargo, ya que debe elegir un tipo de evento específico como QEvent::KeyPress o QEvent::KeyRelease.

0

A Qt4.7 note with code for converting KeyEvent to KeySequence. (Sin embargo, el código es erróneo porque arroja un int para el código clave de QKeyEvent.key() en una cadena. Es mejor usar QKeyEvent.text()?)

Además, el código en la respuesta de Fernando :

QKeySequence(event.key() | event.modifiers()) 

no es un tipo seguro (mezclas int y QKeyboardModifiers) y si se convierte a Python falla en PyQt, pero no en PySide?

Además, "QKeyEvent representa el evento de una sola pulsación de tecla o liberación" en realidad no lo explica. Un QKeyEvent puede decirle qué combinación de teclas estaba abajo, pero no el orden en que fueron presionadas. Cuando el usuario presiona las teclas en secuencia, su aplicación podría obtener una secuencia de QKeyEvents (dependiendo de si su aplicación utiliza manipuladores predeterminados versus reemplazados para QKeyEvent.) Los QKeyEvents posteriores le mostrarán todas las claves que estaban caídas en el momento del evento . Es posible que ya no estén abajo. Es bastante complicado.

4

Una solución simple (escrito en Python):

key = QKeySequence(event.modifiers()|event.key()).toString() 

le dará toda la secuencia en forma de cadena, como "Ctrl + Q".

Los beneficios son (al menos en python) que puede encontrar en un dict de accesos directos, mientras que QKeySequence no habría sido hashable.

Tenga en cuenta que esto espera que utilice el tipo de caja y el espaciado correctos. "ctrl + Q" no coincidirá. Para evitar todos los problemas, puede hacer lo siguiente cuando la primera lectura de los accesos directos:

shortcut = shortcut.lower().remove(' ') 

y combinar/encontrar usando

key = QKeySequence(event.modifiers()|event.key()).toString().lower() 

o mejor aún:

shortcut = QKeySequence(shortcut).toString() 

y combinar directamente.