Deutsch English

Enter- und Return-Tastendrücke abfangen

Überblick

Es gibt zahlreiche Anwendungen für das Abfangen von Enter-Tastendrücken, etwa eine Suchfunktion, die ausgelöst wird, wenn man die Enter-Taste drückt. Leider ist das nicht so einfach, wie andere Tasten abzufangen, da die übliche Event-Routine von Qt gewisse Tastendrücke bearbeitet, bevor das eigentliche Programm sie abfangen kann.

Lösung

Qt erlaubt es glücklicherweise, die Event-Routine neu zu implementieren. Dazu benötigen wir eine neue Klasse, die eine Methode beinhaltet, die als Event-Filter eingesetzt werden kann:

  1. bool eventFilter(QObject *obj, QEvent *event);

Mehr ist auch gar nicht notwendig:

  1. class keyEnterReceiver : public QObject
  2. {
  3.     Q_OBJECT
  4.  
  5. protected:
  6.     bool eventFilter(QObject *obj, QEvent *event);
  7. };

Nun müssen wir noch die Methode implementieren:

  1. bool keyEnterReceiver::eventFilter(QObject *obj, QEvent *event)
  2. {
  3.     if(event->type() == QEvent::KeyPress)
  4.     {
  5.         QKeyEvent *key = static_cast<QKeyEvent *>(event);
  6.  
  7.         if((key->key() == Qt::Key_Enter) || (key->key() == Qt::Key_Return))
  8.         {
  9.             //Enter oder Return wurde gedrückt
  10.         }
  11.         else
  12.         {
  13.             return QObject::eventFilter(obj, event);
  14.         }
  15.         return true;
  16.     }
  17.     else
  18.     {
  19.         return QObject::eventFilter(obj, event);
  20.     }
  21.  
  22.     return false;
  23. }

Das ging jetzt ein bisschen schnell – daher hier noch eine ausführlichere Erklärung:

Tastendruck?

Erst wird überprüft, ob es sich überhaupt um ein KeyPress-Event handelt. Wenn nicht, soll Qt das Event-Handling übernehmen:

  1. bool keyEnterReceiver::eventFilter(QObject *obj, QEvent *event)
  2. {
  3.     if(event->type() == QEvent::KeyPress)
  4.     {
  5.         ...
  6.     }
  7.     else
  8.     {
  9.         return QObject::eventFilter(obj, event);
  10.     }
  11.  
  12.     return false;
  13. }

Konvertierung

Als Parameter haben wir ein QEvent erhalten. Daraus kann man aber keine Tastendrücke auslesen. Daher muss das Ganze noch in ein QKeyEvent konvertiert werden:

  1. QKeyEvent *key = static_cast<QKeyEvent *>(event);

Enter/Return oder eine andere Taste?

Der Rest ist nicht besonders schwierig – jetzt muss nur noch überprüft werden, ob es sich um Enter handelt oder nicht:

  1. if((key->key() == Qt::Key_Enter) || (key->key() == Qt::Key_Return))
  2. {
  3.     //Enter oder Return wurde gedrückt
  4. }
  5. else
  6. {
  7.     return QObject::eventFilter(obj, event);
  8. }
  9. return true;

Installation

Nun können wir unseren Event-Handler installieren:

  1. keyEnterReceiver *key = new keyEnterReceiver();
  2. aWidgetInAnotherClass->installEventFilter(key);

Categories: