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.

En Ar Bg De El Es Fa Fi Fr Hi Hu It Ja Kn Ko Ms Nl Pl Pt Ru Sq Th Tr Uk Zh

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