How to catch enter key/de

From Qt Wiki
< How to catch enter key
Revision as of 15:45, 15 April 2020 by Katzschke (talk | contribs) (added language switch)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

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