How to catch enter key/de: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
Line 1: Line 1:
[[Category:German]]<br />[[Category:HowTo]]
[[Category:German]]
[[Category:HowTo]]


'''Deutsch''' [[How_to_catch_enter_key|English]]
'''Deutsch''' [[How_to_catch_enter_key|English]]


[toc align_right=&quot;yes&amp;quot;]
[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:<br /><code><br />bool eventFilter(QObject *obj, QEvent *event);<br /></code>
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:<br /><code><br />class keyEnterReceiver : public QObject<br />{<br /> Q_OBJECT
Mehr ist auch gar nicht notwendig:
<code>
class keyEnterReceiver : public QObject
{
Q_OBJECT


protected:<br /> bool eventFilter(QObject *obj, QEvent *event);<br />};<br /></code>
protected:
bool eventFilter(QObject *obj, QEvent *event);
};
</code>


Nun müssen wir noch die Methode implementieren:<br /><code><br />bool keyEnterReceiver::eventFilter(QObject *obj, QEvent *event)<br />{<br /> if(event-&gt;type() == QEvent::KeyPress)<br /> {<br /> QKeyEvent '''key = static_cast&amp;lt;QKeyEvent'''&gt;(event);
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-&gt;key()  Qt::Key_Enter) || (key-&amp;gt;key()  Qt::Key_Return))<br /> {<br /> //Enter oder Return wurde gedrückt<br /> }<br /> else<br /> {<br /> return QObject::eventFilter(obj, event);<br /> }<br /> return true;<br /> }<br /> else<br /> {<br /> return QObject::eventFilter(obj, event);<br /> }
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;<br />}<br /></code>
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:<br /><code><br />bool keyEnterReceiver::eventFilter(QObject *obj, QEvent *event)<br />{<br /> if(event-&gt;type() == QEvent::KeyPress)<br /> {<br /> <br /> }<br /> else<br /> {<br /> return QObject::eventFilter(obj, event);<br /> }
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;<br />}<br /></code>
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:<br /><code><br />QKeyEvent '''key = static_cast&amp;lt;QKeyEvent'''&gt;(event);<br /></code>
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:<br /><code><br />if((key-&gt;key()  Qt::Key_Enter) || (key-&amp;gt;key()  Qt::Key_Return))<br />{<br /> //Enter oder Return wurde gedrückt<br />}<br />else<br />{<br /> return QObject::eventFilter(obj, event);<br />}<br />return true;<br /></code>
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:<br /><code><br />keyEnterReceiver *key = new keyEnterReceiver();<br />aWidgetInAnotherClass-&gt;installEventFilter(key);
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);