How to catch enter key

From Qt Wiki
Revision as of 14:46, 23 February 2015 by Maintenance script (talk | contribs)
Jump to navigation Jump to search


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-&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 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-&gt;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&amp;lt;QKeyEvent'''&gt;(event);<br />

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 />if((key-&gt;key()  Qt::Key_Enter) || (key-&amp;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);