How to catch enter key: Difference between revisions
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
[[Category:HowTo]] | |||
'''English''' [[How_to_catch_enter_key_German|Deutsch]] | |||
= | [toc align_right="yes"] | ||
= How to catch enter key events = | |||
== | == Overview == | ||
There are many different situations where you can use the enter key, e.g. to start a search action. But implementing something like this is not that easy - Qt catches enter keys before you even get the event. | |||
== Solution == | |||
Fortunately, Qt allows to reimplement the general event catching method. You need a new class with a method like this:<br /><code><br />bool eventFilter(QObject *obj, QEvent *event);<br /></code> | |||
That | That's everything:<br /><code><br />class keyEnterReceiver : public QObject<br />{<br /> Q_OBJECT | ||
protected:<br /> bool eventFilter(QObject *obj, QEvent *event);<br />};<br /></code> | |||
Now, we have to implement the method:<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 or return was pressed<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> | |||
That was quiet fast - so here is a detailled explanation: | |||
=== Key pressed? === | |||
First, we check if any key was pressed. If not, it is a event that has nothing to do with keys - and Qt should handle it:<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> | |||
=== Convertion === | |||
We got a QEvent as a parameter. To read out which key was pressed, we need to convert the QEvent to a QKeyEvent:<br /><code><br />QKeyEvent '''key = static_cast&lt;QKeyEvent'''>(event);<br /></code> | |||
=== Enter/Return or another key? === | |||
That's it. Now we only have to check whether it was "our&quot; enter key or another key we are not interested in:<br /><code><br />if((key->key() Qt::Key_Enter) || (key-&gt;key() Qt::Key_Return))<br />{<br /> //Enter or return was pressed<br />}<br />else<br />{<br /> return QObject::eventFilter(obj, event);<br />}<br />return true;<br /></code> | |||
Finally, we can install our event handler:<br /><code><br />keyEnterReceiver *key = new keyEnterReceiver();<br />aWidgetInAnotherClass->installEventFilter(key); |
Revision as of 14:46, 23 February 2015
English Deutsch
[toc align_right="yes"]
How to catch enter key events
Overview
There are many different situations where you can use the enter key, e.g. to start a search action. But implementing something like this is not that easy - Qt catches enter keys before you even get the event.
Solution
Fortunately, Qt allows to reimplement the general event catching method. You need a new class with a method like this:
<br />bool eventFilter(QObject *obj, QEvent *event);<br />
That's everything:
<br />class keyEnterReceiver : public QObject<br />{<br /> Q_OBJECT
protected:<br /> bool eventFilter(QObject *obj, QEvent *event);<br />};<br />
Now, we have to implement the method:
<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 or return was pressed<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 />
That was quiet fast - so here is a detailled explanation:
Key pressed?
First, we check if any key was pressed. If not, it is a event that has nothing to do with keys - and Qt should handle it:
<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 />
Convertion
We got a QEvent as a parameter. To read out which key was pressed, we need to convert the QEvent to a QKeyEvent:
<br />QKeyEvent '''key = static_cast&lt;QKeyEvent'''>(event);<br />
Enter/Return or another key?
That's it. Now we only have to check whether it was "our" enter key or another key we are not interested in:
<br />if((key->key() Qt::Key_Enter) || (key-&gt;key() Qt::Key_Return))<br />{<br /> //Enter or return was pressed<br />}<br />else<br />{<br /> return QObject::eventFilter(obj, event);<br />}<br />return true;<br />
Finally, we can install our event handler:
keyEnterReceiver *key = new keyEnterReceiver();
aWidgetInAnotherClass->installEventFilter(key);