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/de: Difference between revisions
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
[[Category:German]] | [[Category:German]] | ||
[[Category:HowTo]] | |||
'''Deutsch''' [[How_to_catch_enter_key|English]] | '''Deutsch''' [[How_to_catch_enter_key|English]] | ||
[toc align_right= | [toc align_right="yes"] | ||
= Enter- und Return-Tastendrücke abfangen = | = Enter- und Return-Tastendrücke abfangen = | ||
Line 13: | Line 14: | ||
== Lösung == | == Lösung == | ||
Qt erlaubt es glücklicherweise, die Event-Routine neu zu implementieren. Dazu benötigen wir eine neue Klasse, die eine Methode beinhaltet, die als Event-Filter eingesetzt werden kann: | Qt erlaubt es glücklicherweise, die Event-Routine neu zu implementieren. Dazu benötigen wir eine neue Klasse, die eine Methode beinhaltet, die als Event-Filter eingesetzt werden kann: | ||
<code> | |||
bool eventFilter(QObject *obj, QEvent *event); | |||
</code> | |||
Mehr ist auch gar nicht notwendig: | Mehr ist auch gar nicht notwendig: | ||
<code> | |||
class keyEnterReceiver : public QObject | |||
{ | |||
Q_OBJECT | |||
protected: | protected: | ||
bool eventFilter(QObject *obj, QEvent *event); | |||
}; | |||
</code> | |||
Nun müssen wir noch die Methode implementieren: | Nun müssen wir noch die Methode implementieren: | ||
<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 oder Return wurde gedrückt | |||
} | |||
else | |||
{ | |||
return QObject::eventFilter(obj, event); | |||
} | |||
return true; | |||
} | |||
else | |||
{ | |||
return QObject::eventFilter(obj, event); | |||
} | |||
return false; | return false; | ||
} | |||
</code> | |||
Das ging jetzt ein bisschen schnell - daher hier noch eine ausführlichere Erklärung: | Das ging jetzt ein bisschen schnell - daher hier noch eine ausführlichere Erklärung: | ||
Line 29: | Line 61: | ||
=== Tastendruck? === | === Tastendruck? === | ||
Erst wird überprüft, ob es sich überhaupt um ein KeyPress-Event handelt. Wenn nicht, soll Qt das Event-Handling übernehmen: | Erst wird überprüft, ob es sich überhaupt um ein KeyPress-Event handelt. Wenn nicht, soll Qt das Event-Handling übernehmen: | ||
<code> | |||
bool keyEnterReceiver::eventFilter(QObject *obj, QEvent *event) | |||
{ | |||
if(event->type() == QEvent::KeyPress) | |||
{ | |||
… | |||
} | |||
else | |||
{ | |||
return QObject::eventFilter(obj, event); | |||
} | |||
return false; | return false; | ||
} | |||
</code> | |||
=== Konvertierung === | === Konvertierung === | ||
Als Parameter haben wir ein QEvent erhalten. Daraus kann man aber keine Tastendrücke auslesen. Daher muss das Ganze noch in ein QKeyEvent konvertiert werden: | Als Parameter haben wir ein QEvent erhalten. Daraus kann man aber keine Tastendrücke auslesen. Daher muss das Ganze noch in ein QKeyEvent konvertiert werden: | ||
<code> | |||
QKeyEvent '''key = static_cast<QKeyEvent'''>(event); | |||
</code> | |||
=== Enter/Return oder eine andere Taste? === | === Enter/Return oder eine andere Taste? === | ||
Der Rest ist nicht besonders schwierig - jetzt muss nur noch überprüft werden, ob es sich um Enter handelt oder nicht: | Der Rest ist nicht besonders schwierig - jetzt muss nur noch überprüft werden, ob es sich um Enter handelt oder nicht: | ||
<code> | |||
if((key->key() Qt::Key_Enter) || (key->key() Qt::Key_Return)) | |||
{ | |||
//Enter oder Return wurde gedrückt | |||
} | |||
else | |||
{ | |||
return QObject::eventFilter(obj, event); | |||
} | |||
return true; | |||
</code> | |||
=== Installation === | === Installation === | ||
Nun können wir unseren Event-Handler installieren: | Nun können wir unseren Event-Handler installieren: | ||
<code> | |||
keyEnterReceiver *key = new keyEnterReceiver(); | |||
aWidgetInAnotherClass->installEventFilter(key); |
Revision as of 10:29, 25 February 2015
Deutsch English
[toc align_right="yes"]
Enter- und Return-Tastendrücke abfangen
Überblick
Es gibt zahlreiche Anwendungen für das Abfangen von Enter-Tastendrücken, etwa eine Suchfunktion, die ausgelöst wird, wenn man die Enter-Taste drückt. Leider ist das nicht so einfach, wie andere Tasten abzufangen, da die übliche Event-Routine von Qt gewisse Tastendrücke bearbeitet, bevor das eigentliche Programm sie abfangen kann.
Lösung
Qt erlaubt es glücklicherweise, die Event-Routine neu zu implementieren. Dazu benötigen wir eine neue Klasse, die eine Methode beinhaltet, die als Event-Filter eingesetzt werden kann:
bool eventFilter(QObject *obj, QEvent *event);
Mehr ist auch gar nicht notwendig:
class keyEnterReceiver : public QObject
{
Q_OBJECT
protected:
bool eventFilter(QObject *obj, QEvent *event);
};
Nun müssen wir noch die Methode implementieren:
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 oder Return wurde gedrückt
}
else
{
return QObject::eventFilter(obj, event);
}
return true;
}
else
{
return QObject::eventFilter(obj, event);
}
return false;
}
Das ging jetzt ein bisschen schnell - daher hier noch eine ausführlichere Erklärung:
Tastendruck?
Erst wird überprüft, ob es sich überhaupt um ein KeyPress-Event handelt. Wenn nicht, soll Qt das Event-Handling übernehmen:
bool keyEnterReceiver::eventFilter(QObject *obj, QEvent *event)
{
if(event->type() == QEvent::KeyPress)
{
…
}
else
{
return QObject::eventFilter(obj, event);
}
return false;
}
Konvertierung
Als Parameter haben wir ein QEvent erhalten. Daraus kann man aber keine Tastendrücke auslesen. Daher muss das Ganze noch in ein QKeyEvent konvertiert werden:
QKeyEvent '''key = static_cast<QKeyEvent'''>(event);
Enter/Return oder eine andere Taste?
Der Rest ist nicht besonders schwierig - jetzt muss nur noch überprüft werden, ob es sich um Enter handelt oder nicht:
if((key->key() Qt::Key_Enter) || (key->key() Qt::Key_Return))
{
//Enter oder Return wurde gedrückt
}
else
{
return QObject::eventFilter(obj, event);
}
return true;
Installation
Nun können wir unseren Event-Handler installieren:
keyEnterReceiver *key = new keyEnterReceiver();
aWidgetInAnotherClass->installEventFilter(key);