How to catch enter key/de

From Qt Wiki
Jump to navigation Jump to search


Deutsch English

[toc align_right="yes"]

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:

<br />bool eventFilter(QObject *obj, QEvent *event);<br />

Mehr ist auch gar nicht notwendig:

<br />class keyEnterReceiver : public QObject<br />{<br /> Q_OBJECT

protected:<br /> bool eventFilter(QObject *obj, QEvent *event);<br />};<br />

Nun müssen wir noch die Methode implementieren:

<br />bool keyEnterReceiver::eventFilter(QObject *obj, QEvent *event)<br />{<br /> if(event-&gt;type() == QEvent::KeyPress)<br /> {<br /> QKeyEvent '''key = static_cast&amp;lt;QKeyEvent'''&gt;(event);

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

return false;<br />}<br />

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:

<br />bool keyEnterReceiver::eventFilter(QObject *obj, QEvent *event)<br />{<br /> if(event-&gt;type() == QEvent::KeyPress)<br /> {<br /> <br /> }<br /> else<br /> {<br /> return QObject::eventFilter(obj, event);<br /> }

return false;<br />}<br />

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:

<br />QKeyEvent '''key = static_cast&amp;lt;QKeyEvent'''&gt;(event);<br />

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:

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

Installation

Nun können wir unseren Event-Handler installieren:

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