2010-06-20 8 views
5

Ich benutze Qt 4.6 und möchte auf Multi-Tasten-Kombinationen (z. B. Key_Q + Key_W), die gedrückt werden, reagieren. Wenn Sie also eine Tastenkombination gedrückt halten, sollte das Ereignis die ganze Zeit aufgerufen werden, genauso wie es bei Einzeltastenereignissen funktioniert. Ich habe versucht, QShortcuts zu bedienen und ermöglichen automatische Wiederholung für sie, aber das hat nicht funktioniert:Qt Mehrfachschlüssel Combo Ereignis

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); 

Bei Verwendung dieses Ansatzes Ich habe auch das Problem, dass ich nicht einzelne Key_W (oder was auch immer der erste Schlüssel in die fangen Keysequenz ist) Striche mehr.

Danke, Thomas

Antwort

6

QShortcut unterstützt nicht die Funktionalität, die Sie suchen. Sie können nur Kombinationen mit Sondertasten wie Shift, Ctrl, Alt und Meta machen.

Was Ihr Code tut, ist eine Verknüpfung zu machen, die reagieren, wenn der Benutzer zuerst drückt W und dann D. Das ist auch, warum es mit anderen Verknüpfungen in Konflikt geraten wird, die reagiert nur W.

Wenn Sie wollen, etwas, wenn beide W und D gleichzeitig gedrückt werden, müssen Sie QWidget keyPressEvent und keyReleaseEvent Methoden überschreiben, um ihren gedrückten Zustand zu verfolgen, und rufen Sie manuell Ihre Handler-Funktion, wenn sie beide gedrückt werden. Wenn Sie keine geeignete QWidget-Unterklasse verwenden, müssen Sie sie entweder einführen oder einen Ereignisfilter an der richtigen Stelle mit QObject::installEventFilter installieren, möglicherweise auf Ihrem Anwendungsobjekt, wenn es sich um eine globale Verknüpfung handelt.

3

Sie können eine gedrückte Taste zu dem Satz gedrückter Tasten hinzufügen und aus dieser Gruppe entfernen, wenn die Taste losgelassen wird. So können Sie die gedrückte Taste zu einem QSet hinzufügen, die eine Klasse Mitglied ist:

QSet<int> pressedKeys; 

Sie können die wichtigsten Ereignisse in einem Ereignisfilter fangen:

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; 
} 

Vergessen Sie nicht, die Ereignisfilter zu installieren im Konstruktor:

this->installEventFilter(this); 
+0

Vielen Dank. Dies ist hilfreich und leicht zu verstehen. – GoodDeeds