How to catch enter key: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
Line 3: Line 3:
'''English''' [[How_to_catch_enter_key_German|Deutsch]]
'''English''' [[How_to_catch_enter_key_German|Deutsch]]


[toc align_right="yes"]
[toc align_right="yes"]


= How to catch enter key events =
= How to catch enter key events =
Line 13: Line 13:
== Solution ==
== 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>
Fortunately, Qt allows to reimplement the general event catching method. You need a new class with a method like this:
<code>
bool eventFilter(QObject *obj, QEvent *event);
</code>


That's everything:<br /><code><br />class keyEnterReceiver : public QObject<br />{<br /> Q_OBJECT
That's everything:
<code>
class keyEnterReceiver : public QObject
{
Q_OBJECT


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


Now, we have to implement the method:<br /><code><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);
Now, we have to implement the method:
<code>
bool keyEnterReceiver::eventFilter(QObject *obj, QEvent *event)
{
if(event->type() == QEvent::KeyPress)
{
QKeyEvent '''key = static_cast<QKeyEvent'''>(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 /> }
if((key->key()  Qt::Key_Enter) || (key->key()  Qt::Key_Return))
{
//Enter or return was pressed
}
else
{
return QObject::eventFilter(obj, event);
}
return true;
}
else
{
return QObject::eventFilter(obj, event);
}


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


That was quiet fast - so here is a detailled explanation:
That was quiet fast - so here is a detailled explanation:
Line 29: Line 60:
=== Key pressed? ===
=== 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-&gt;type() == QEvent::KeyPress)<br /> {<br /> <br /> }<br /> else<br /> {<br /> return QObject::eventFilter(obj, event);<br /> }
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:
<code>
bool keyEnterReceiver::eventFilter(QObject *obj, QEvent *event)
{
if(event->type() == QEvent::KeyPress)
{
}
else
{
return QObject::eventFilter(obj, event);
}


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


=== Convertion ===
=== 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&amp;lt;QKeyEvent'''&gt;(event);<br /></code>
We got a QEvent as a parameter. To read out which key was pressed, we need to convert the QEvent to a QKeyEvent:
<code>
QKeyEvent '''key = static_cast<QKeyEvent'''>(event);
</code>


=== Enter/Return or another key? ===
=== Enter/Return or another key? ===


That's it. Now we only have to check whether it was &quot;our&amp;quot; enter key or another key we are not interested in:<br /><code><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 /></code>
That's it. Now we only have to check whether it was "our" enter key or another key we are not interested in:
<code>
if((key->key()  Qt::Key_Enter) || (key->key()  Qt::Key_Return))
{
//Enter or return was pressed
}
else
{
return QObject::eventFilter(obj, event);
}
return true;
</code>


Finally, we can install our event handler:<br /><code><br />keyEnterReceiver *key = new keyEnterReceiver();<br />aWidgetInAnotherClass-&gt;installEventFilter(key);
Finally, we can install our event handler:
<code>
keyEnterReceiver *key = new keyEnterReceiver();
aWidgetInAnotherClass->installEventFilter(key);

Revision as of 09:09, 25 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:

bool eventFilter(QObject *obj, QEvent *event);

That's everything:

class keyEnterReceiver : public QObject
{
 Q_OBJECT

protected:
 bool eventFilter(QObject *obj, QEvent *event);
};

Now, we have to implement the method:

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 or return was pressed
 }
 else
 {
 return QObject::eventFilter(obj, event);
 }
 return true;
 }
 else
 {
 return QObject::eventFilter(obj, event);
 }

return false;
}

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:

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

return false;
}

Convertion

We got a QEvent as a parameter. To read out which key was pressed, we need to convert the QEvent to a QKeyEvent:

QKeyEvent '''key = static_cast<QKeyEvent'''>(event);

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:

if((key->key()  Qt::Key_Enter) || (key->key()  Qt::Key_Return))
{
 //Enter or return was pressed
}
else
{
 return QObject::eventFilter(obj, event);
}
return true;

Finally, we can install our event handler: keyEnterReceiver *key = new keyEnterReceiver(); aWidgetInAnotherClass->installEventFilter(key);