2009-07-17 10 views
1

Je voudrais appeler un code de copie personnalisé lorsque l'utilisateur publie Ctrl + C. Lorsque C est libéré avant Ctrl, Qt envoie un événement clé qui correspond à QKeySequence::Copy. Lorsque Ctrl est libéré avant C, l'événement de sortie ne correspond pas.Comment attraper l'événement de touche Ctrl + C avec Qt lorsque Ctrl est relâché avant 'C'?

Lorsque l'événement de sortie clé vient avec Ctrl, est-il un moyen de voir si C est toujours maintenue enfoncée?

Lorsque je ne gère pas Ctrl étant publié d'abord, l'événement est transmis et il fait une copie régulière, ce qui est exactement ce que je ne veux pas arriver.

bool 
MyWidget::eventFilter(QObject* object, QEvent* event) 
{ 
    // the text edit box filters its events through here 
    if (object == m_text_edit_box) 
    { 
     if (event->type() == QEvent::KeyPress) 
     { 
     QKeyEvent *key_event = static_cast<QKeyEvent*>(event); 

     if (key_event->matches(QKeySequence::Copy)) 
     { 
      // don't do anything and don't pass along event 
      return true; 
     } 
     } 
     else if (event->type() == QEvent::KeyRelease) 
     { 
     QKeyEvent *key_event = static_cast<QKeyEvent*>(event); 

     if (key_event->matches(QKeySequence::Copy)) 
     { 
      // we only get in here if 'c' is released before ctrl 
      callCustomCopy(); 
      return true; 
     } 
     } 
    } 

    // pass along event 
    return false; 
} 

Répondre

1

Vous pouvez interroger la lettre « C » et la clé méta « Ctrl » spécifique et ne se fondent sur key_even-> matchs(). vous pouvez bien sûr dans l'objet où vous avez localisé le filtre d'événement sur l'événement keydown stocker le fait que la séquence de clavier correspond à la copie. Ceci (non testé) pourrait fonctionner pour vous, notez que la variable statique devrait être une variable membre de la classe dans laquelle elle est contenue, cela semblait juste plus clair dans le contexte de cet exemple. La logique exacte de ce que vous voulez accomplir peut nécessiter plus d'informations d'état à porter entre les événements.

bool MyWidget::eventFilter(QObject* object, QEvent* event) 
{ 
    // Remember state between events 
    static foundCopy = false; 
    // the text edit box filters its events through here 
    if (object == m_text_edit_box) 
    { 
    if (event->type() == QEvent::KeyPress) 
    { 
    QKeyEvent *key_event = static_cast<QKeyEvent*>(event); 
     if (key_event->matches(QKeySequence::Copy)) 
     { 
     foundCopy = true; 
     // don't do anything and don't pass along event 
     return true; 
     } 
     else 
     { 
     foundCopy = false; 
     // This is another sequence, ignore and pass event 
     // Note that this will trigger with ctrl+c+a and others 

     } 
    } 
    else if (event->type() == QEvent::KeyRelease) 
    { 
     QKeyEvent *key_event = static_cast<QKeyEvent*>(event); 
     if (foundCopy) 
     { 
     callCustomCopy(); 
     foundCopy = false; 
     return true; 
     } 
     // This should keep the system copy from triggering 
     if (key_event->matches(QKeySequence::Copy)) 
     { 
     return true; 
     } 
    } 
    } 

    // pass along event 
return false; 
} 

Une autre façon serait de recueillir l'état réel de toutes les touches pressées à l'heure actuelle et puis quand on est libéré voir ceux qui sont toujours pressés. Du point de vue de l'interface utilisateur, rappelez-vous que toutes les actions du clavier sont effectuées sur presse, (ex: typage, collage de fenêtres), les actions à la libération en général peuvent perturber l'utilisateur, surtout quand il y a un résultat visible l'action. Je ne peux pas dire de votre exemple ce que vous essayez d'accomplir.

Questions connexes