How to catch enter key: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
(Add "cleanup" tag)
m (use syntaxhighlight)
 
(2 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{Cleanup | reason=Auto-imported from ExpressionEngine.}}
{{LangSwitch}}
 
[[Category:HowTo]]
[[Category:HowTo]]
'''English''' [[How_to_catch_enter_key_German|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.
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.


Line 16: Line 6:


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>
<syntaxhighlight lang="cpp">
bool eventFilter(QObject *obj, QEvent *event);
bool eventFilter(QObject* obj, QEvent* event);
</code>
</syntaxhighlight>


That's everything:
That's everything:
<code>
<syntaxhighlight lang="cpp">
class keyEnterReceiver : public QObject
class keyEnterReceiver : public QObject
{
{
Q_OBJECT
    Q_OBJECT
 
protected:
protected:
bool eventFilter(QObject *obj, QEvent *event);
    bool eventFilter(QObject* obj, QEvent* event);
};
};
</code>
</syntaxhighlight>


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


That was quiet fast - so here is a detailled explanation:
That was quiet fast - so here is a detailled explanation:
Line 63: Line 44:


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>
<syntaxhighlight lang="cpp">
bool keyEnterReceiver::eventFilter(QObject *obj, QEvent *event)
bool keyEnterReceiver::eventFilter(QObject* obj, QEvent* event)
{
{
if(event->type() == QEvent::KeyPress)
    if(event->type()==QEvent::KeyPress) {
{
       
    } else {
}
        return QObject::eventFilter(obj, event);
else
    }
{
    return false;
return QObject::eventFilter(obj, event);
}
 
return false;
}
}
</code>
</syntaxhighlight>


=== 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>
<syntaxhighlight lang="cpp">
QKeyEvent '''key = static_cast<QKeyEvent'''>(event);
QKeyEvent* key = static_cast<QKeyEvent*>(event);
</code>
</syntaxhighlight>


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


Finally, we can install our event handler:
Finally, we can install our event handler:
<code>
<syntaxhighlight lang="cpp">
keyEnterReceiver *key = new keyEnterReceiver();
keyEnterReceiver* key = new keyEnterReceiver();
aWidgetInAnotherClass->installEventFilter(key);
aWidgetInAnotherClass->installEventFilter(key);
</syntaxhighlight>

Latest revision as of 08:50, 25 May 2021

En Ar Bg De El Es Fa Fi Fr Hi Hu It Ja Kn Ko Ms Nl Pl Pt Ru Sq Th Tr Uk Zh

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