2010-06-20 24 views
5

Estoy usando Qt 4.6 y me gustaría reaccionar a las combinaciones de teclas múltiples (por ejemplo, Key_Q + Key_W) que se mantienen presionadas. Por lo tanto, cuando mantiene presionada una combinación de teclas, el evento debe ser llamado todo el tiempo, del mismo modo que funciona con eventos de tecla única. He intentado utilizar QShortcuts y permitir repetición automática para ellos, pero que no funcionó:Qt evento de combinación de teclas múltiples

keyCombos_.push_back(new QShortcut(QKeySequence(Qt::Key_W, Qt::Key_D), this)); 
connect(keyCombos_[0], SIGNAL(activated()), SLOT(keySequenceEvent_WD())); 
setShortcutAutoRepeat(keyCombos_[0]->id(), true); 

Al utilizar este enfoque también tengo el problema de que no puedo coger sola Key_W (o lo que sea la primera clave en el keysequence es) golpes más.

Gracias, Thomas

Respuesta

6

QShortcut no es compatible con la funcionalidad que está buscando. Solo puede hacer combinaciones con teclas modificadoras como Mayús, Ctrl, Alt y Meta.

Lo que hace el código es hacer un acceso directo que responde cuando el primer usuario pulsa W y D. Esta es la razón por la que va a entrar en conflicto con otros accesos directos que responden a solo W.

Cuando se quiere hacer algo cuando se presionan tanto W como D al mismo tiempo, tendrá que anular los métodos keyPressEvent y keyReleaseEvent de QWidget con el fin de mantener un registro de su estado presionado, y llamar manualmente a su función de controlador una vez que ambos se presionan. Si no tiene una subclase de QWidget adecuada en uso, deberá introducirla o instalar un filtro de eventos en el lugar correcto usando QObject::installEventFilter, posiblemente en su objeto de aplicación si se supone que es un atajo global.

3

Puede agregar una tecla presionada al conjunto de teclas presionadas y eliminarlas de este conjunto cuando se suelta la tecla. Lo que puede añadir la tecla pulsada a un Qset que es un miembro de la clase:

QSet<int> pressedKeys; 

Puede capturar los eventos clave en un filtro de eventos:

bool MyWidget::eventFilter(QObject * obj, QEvent * event) 
{ 

    if(event->type()==QEvent::KeyPress) { 

     pressedKeys += ((QKeyEvent*)event)->key(); 

     f(pressedKeys.contains(Qt::Key_D) && pressedKeys.contains(Qt::Key_W)) 
     { 
      // D and W are pressed 
     } 

    } 
    else if(event->type()==QEvent::KeyRelease) 
    { 

     pressedKeys -= ((QKeyEvent*)event)->key(); 
    } 


    return false; 
} 

no se olvide de instalar el filtro de eventos en el constructor:

this->installEventFilter(this); 
+0

Gracias. Esto es útil y fácil de entender. – GoodDeeds

Cuestiones relacionadas