How to catch enter key: Difference between revisions
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= | [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: | 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: | That's everything: | ||
<code> | |||
class keyEnterReceiver : public QObject | |||
{ | |||
Q_OBJECT | |||
protected: | protected: | ||
bool eventFilter(QObject *obj, QEvent *event); | |||
}; | |||
</code> | |||
Now, we have to implement the method: | 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- | 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; | 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: | 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; | 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: | 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 | 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: | 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);