How to catch enter key/de: Difference between revisions
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
[[Category:German]]<br />[[Category:HowTo]] | |||
'''Deutsch''' [[How_to_catch_enter_key|English]] | |||
==Überblick== | [toc align_right="yes&quot;] | ||
= 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. | 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== | == 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 /><code><br />bool eventFilter(QObject *obj, QEvent *event);<br /></code> | |||
Mehr ist auch gar nicht notwendig:<br /><code><br />class keyEnterReceiver : public QObject<br />{<br /> Q_OBJECT | |||
protected:<br /> bool eventFilter(QObject *obj, QEvent *event);<br />};<br /></code> | |||
Nun müssen wir noch die Methode implementieren:<br /><code><br />bool keyEnterReceiver::eventFilter(QObject *obj, QEvent *event)<br />{<br /> if(event->type() == QEvent::KeyPress)<br /> {<br /> QKeyEvent '''key = static_cast&lt;QKeyEvent'''>(event); | |||
if((key->key() Qt::Key_Enter) || (key-&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 /></code> | |||
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 /><code><br />bool keyEnterReceiver::eventFilter(QObject *obj, QEvent *event)<br />{<br /> if(event->type() == QEvent::KeyPress)<br /> {<br /> …<br /> }<br /> else<br /> {<br /> return QObject::eventFilter(obj, event);<br /> } | ||
return false;<br />}<br /></code> | |||
=== | === 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 /><code><br />QKeyEvent '''key = static_cast&lt;QKeyEvent'''>(event);<br /></code> | |||
=== | === 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 /><code><br />if((key->key() Qt::Key_Enter) || (key-&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 /></code> | |||
=== | === Installation === | ||
Nun können wir unseren Event-Handler installieren:<br /><code><br />keyEnterReceiver *key = new keyEnterReceiver();<br />aWidgetInAnotherClass->installEventFilter(key); | |||
* |
Revision as of 10:09, 24 February 2015
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->type() == QEvent::KeyPress)<br /> {<br /> QKeyEvent '''key = static_cast&lt;QKeyEvent'''>(event);
if((key->key() Qt::Key_Enter) || (key-&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->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&lt;QKeyEvent'''>(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->key() Qt::Key_Enter) || (key-&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);