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
No edit summary
(Add "cleanup" tag)
Line 1: Line 1:
{{Cleanup | reason=Auto-imported from ExpressionEngine.}}
[[Category:HowTo]]
[[Category:HowTo]]



Revision as of 15:59, 3 March 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

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