Qt wiki will be updated on October 12th 2023 starting at 11:30 AM (EEST) and the maintenance will last around 2-3 hours. During the maintenance the site will be unavailable.

How to catch enter key: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
(Add "cleanup" tag)
(Remove non-functioning "toc" command)
Line 5: Line 5:
'''English''' [[How_to_catch_enter_key_German|Deutsch]]
'''English''' [[How_to_catch_enter_key_German|Deutsch]]


[toc align_right="yes"]


= How to catch enter key events =
= How to catch enter key events =

Revision as of 12:22, 17 April 2015

This article may require cleanup to meet the Qt Wiki's quality standards. Reason: Auto-imported from ExpressionEngine.
Please improve this article if you can. Remove the {{cleanup}} tag and add this page to Updated pages list after it's clean.

English Deutsch


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);