How to catch enter key/de

From Qt Wiki
Jump to: navigation, search
This article may require cleanup to meet the Qt Wiki's quality standards. Reason: Auto-imported from ExpressionEngine.
Please improve this article if you can. Remove the {{cleanup}} tag and add this page to Updated pages list after it's clean.

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:

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

Mehr ist auch gar nicht notwendig:

class keyEnterReceiver : public QObject
{
 Q_OBJECT
 
protected:
 bool eventFilter(QObject *obj, QEvent *event);
};

Nun müssen wir noch die Methode implementieren:

bool keyEnterReceiver::eventFilter(QObject *obj, QEvent *event)
{
 if(event->type() == QEvent::KeyPress)
 {
 QKeyEvent '''key = static_cast<QKeyEvent'''>(event);
 
if((key->key()  Qt::Key_Enter) || (key->key()  Qt::Key_Return))
 {
 //Enter oder Return wurde gedrückt
 }
 else
 {
 return QObject::eventFilter(obj, event);
 }
 return true;
 }
 else
 {
 return QObject::eventFilter(obj, event);
 }
 
return false;
}

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:

bool keyEnterReceiver::eventFilter(QObject *obj, QEvent *event)
{
 if(event->type() == QEvent::KeyPress)
 {}
 else
 {
 return QObject::eventFilter(obj, event);
 }
 
return false;
}

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:

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:

if((key->key()  Qt::Key_Enter) || (key->key()  Qt::Key_Return))
{
 //Enter oder Return wurde gedrückt
}
else
{
 return QObject::eventFilter(obj, event);
}
return true;

Installation

Nun können wir unseren Event-Handler installieren:

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