Eingaben auf einem Embedded-Linux-Gerät
Wenn auf Ihrem Embedded Linux Gerät kein Windowing System vorhanden ist, werden Maus-, Tastatur- und Berührungseingaben direkt über evdev oder mit Hilfe von Hilfsbibliotheken wie libinput oder tslib gelesen. Dieses Verhalten erfordert jedoch, dass die Geräteknoten /dev/input/event* für den Benutzer lesbar sind. eglfs und linuxfb haben den gesamten Code zur Eingabeverarbeitung einkompiliert.
libinput verwenden
libinput ist eine Bibliothek zur Handhabung von Eingabegeräten, die eine Alternative zur Qt-eigenen evdev Eingabeunterstützung bietet. Um die Verwendung von libinput zu ermöglichen, stellen Sie bei der Konfiguration und Erstellung von Qt sicher, dass die Entwicklungsdateien für libudev und libinput verfügbar sind. Wenn Sie Tastaturunterstützung benötigen, dann ist auch xkbcommon notwendig. Bei eglfs und linuxfb sind keine weiteren Maßnahmen erforderlich, da diese Plugins standardmäßig libinput verwenden. Wenn die Unterstützung von libinput nicht verfügbar ist oder die Umgebungsvariable QT_QPA_EGLFS_NO_LIBINPUT gesetzt ist, werden stattdessen die Qt-eigenen evdev Handler verwendet.
Die folgenden Umgebungsvariablen sind verfügbar, wenn Eingabeereignisse über libinput empfangen werden:
| Variable | Beschreibung |
|---|---|
QT_QPA_LIBINPUT_TOUCH_MATRIX | Gibt die ersten beiden Zeilen der 3x3-Transformationsmatrix an, die angewendet werden soll. Es wird erwartet, dass die Werte durch Leerzeichen getrennt sind. Siehe die libinput-Dokumentation für weitere Details. |
Eingabe auf eglfs und linuxfb ohne libinput
Parameter wie der Name des Geräteknotens können in den Umgebungsvariablen QT_QPA_EVDEV_MOUSE_PARAMETERS, QT_QPA_EVDEV_KEYBOARD_PARAMETERS und QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS gesetzt werden; trennen Sie Ihre Einträge mit Doppelpunkten. Diese Parameter sind eine Alternative zur Übergabe der Einstellungen im Befehlszeilenargument -plugin, und bei einigen Backends sind sie unerlässlich. Aber eglfs und linuxfb verwenden eingebaute Eingabehandler, so dass kein separates Argument -plugin verwendet wird.
Außerdem können die eingebauten Input-Handler deaktiviert werden, indem man QT_QPA_EGLFS_DISABLE_INPUT (für eglfs) oder QT_QPA_FB_DISABLE_INPUT (für linuxfb) auf 1 setzt.
Maus
Der Mauszeiger wird immer dann angezeigt, wenn QT_QPA_EGLFS_HIDECURSOR (für eglfs) oder QT_QPA_FB_HIDECURSOR (für linuxfb) nicht gesetzt ist und die libudev-basierte Geräteerkennung von Qt meldet, dass mindestens eine Maus verfügbar ist. Wenn libudev keine Unterstützung bietet, wird der Mauszeiger immer angezeigt, es sei denn, er wird explizit über die Umgebungsvariable deaktiviert.
Wenn Qt mit libudev -Unterstützung konfiguriert wurde, wird das Verbinden oder Trennen eines Eingabegeräts bei laufender Anwendung (Hot Plugging) unterstützt. Dann sind libudev Entwicklungsheader in der sysroot zur Konfigurationszeit vorhanden.
Der evdev mouse handler unterstützt die folgenden zusätzlichen Parameter:
| Parameter | Beschreibung |
|---|---|
/dev/input/... | Gibt den Namen des Eingabegerätes an. Wenn er nicht angegeben wird, sucht Qt nach einem geeigneten Gerät entweder über libudev oder durch Durchlaufen der verfügbaren Nodes. |
nocompress | Standardmäßig werden Eingabeereignisse, die nicht zu einer Änderung der Position gegenüber dem letzten Qt-Mausereignis führen, komprimiert. Ein neues Qt-Maus-Ereignis wird erst nach einer Änderung der Position oder des Schaltflächenstatus gesendet. Um dieses Verhalten zu deaktivieren, setzen Sie den Parameter nocompress. |
dejitter | Legt ein Jitter-Limit fest; standardmäßig deaktiviert. |
grab | Wenn er auf 1 gesetzt ist, greift Qt auf das Gerät zu, um es exklusiv zu verwenden. |
abs | Einige Touchscreens melden absolute Koordinaten und können nicht von Touchpads unterschieden werden. In diesem Fall übergeben Sie abs, um anzugeben, dass das Gerät absolute Ereignisse verwendet. |
Tastatur
Der evdev keyboard handler unterstützt die folgenden zusätzlichen Parameter:
| Parameter | Beschreibung |
|---|---|
/dev/input/... | Gibt den Namen des Eingabegerätes an. Wenn nicht angegeben, sucht Qt entweder über libudev oder durch Durchlaufen der verfügbaren Knoten nach einem geeigneten Gerät. |
grab | Aktiviert das Greifen des Eingabegerätes. |
keymap | Legt den Namen einer benutzerdefinierten Tastaturbelegungsdatei fest. |
enable-compose | Ermöglicht Compositing. |
repeat-delay | Legt eine benutzerdefinierte Verzögerung für die Tastenwiederholung fest. |
repeat-rate | Legt eine benutzerdefinierte Tastenwiederholungsrate fest. |
Auf Embedded-Linux-Systemen, deren Terminal-Sessions nicht deaktiviert sind, kann das Verhalten beim Drücken einer Taste verwirrend sein, da das Eingabe-Ereignis von der Qt-Anwendung und dem Tty verarbeitet wird. Um dies zu umgehen, gibt es die folgenden Optionen:
- Beim Start der Anwendung versuchen
EGLFSundLinuxFBdie Terminaltastatur zu deaktivieren, indem sie den Tastaturmodus des Ttys aufK_OFFsetzen. Dies verhindert, dass Tastenanschläge an das Terminal gesendet werden. Wenn das Standardverhalten erforderlich ist, setzen Sie die UmgebungsvariableQT_QPA_ENABLE_TERMINAL_KEYBOARDauf1. Beachten Sie, dass dies nur funktioniert, wenn die Anwendung von einer entfernten Konsole aus gestartet wird, z. B. überssh, und die Eingabe über die Terminaltastatur aktiviert bleibt. - Ein alternativer Ansatz ist die Verwendung des
grab-Parameters desevdev-Tastaturhandlers durch Übergabe vongrab=1anQT_QPA_EVDEV_KEYBOARD_PARAMETERS. Dies führt dazu, dass versucht wird, einen Zugriff auf das Eingabegerät zu erhalten. Wenn dergraberfolgreich ist, erhalten keine anderen Komponenten im System Ereignisse von ihm, solange die Qt-Anwendung läuft. Dieser Ansatz ist besser geeignet für Anwendungen, die aus der Ferne gestartet werden, da sie keinen Zugriff auf das tty-Gerät benötigen. - Schließlich ist es für viele spezialisierte Embedded Linux-Images nicht sinnvoll, die Standard-Terminal-Sessions von vornherein zu aktivieren. Weitere Details zur Deaktivierung dieser Terminal-Sessions finden Sie in der Dokumentation Ihrer Build-Umgebung. Wenn Sie z.B. Images mit dem Yocto Projekt erzeugen, führt das Deaktivieren von
SYSVINIT_ENABLED_GETTYSdazu, dass keingettyProzess läuft. Das bedeutet, dass es keine Eingaben auf einem der virtuellen Terminals gibt.
Wenn die standardmäßig eingebaute Tastaturbelegung nicht ausreicht, können Sie über den Parameter keymap eine andere festlegen.
Hinweis: Spezielle Systemtastenkombinationen wie Konsolenumschaltung (Ctrl+Alt+Fx) oder zap (Ctrl+Alt+Backspace) werden derzeit nicht unterstützt und werden ignoriert.
Um eine benutzerdefinierte Tastaturbelegung zu erstellen, verwenden Sie das Dienstprogramm kmap2qmap, das sich im Modul qttools befindet. Die Quelldateien müssen im Standard-Linux kmap Format vorliegen, das vom loadkeys Befehl des Kernels verstanden wird. qmap Dateien können auf eine der folgenden Arten erzeugt werden:
- Das Linux Console Tools (LCT) Projekt.
- X.org X11 Keymaps können mit dem
ckbcompDienstprogramm in daskmapFormat konvertiert werden. - Da es sich bei
kmapum reine Textdateien handelt, können sie auch von Hand erstellt werden.
kmap2qmap ist ein Kommandozeilenprogramm, das mindestens 2 Dateien als Parameter benötigt. Der letzte Parameter ist die erzeugte .qmap Datei, während alle anderen als Eingabedateien .kmap geparst werden. Ein Beispiel:
kmap2qmap i386/qwertz/de-latin1-nodeadkeys.kmap include/compose.latin1.inc de-latin1-nodeadkeys.qmap
Hinweis: kmap2qmap unterstützt nicht alle (Pseudo-)Symbole, die der Linux-Kernel unterstützt. Wenn Sie eine Standard-Tastaturbelegung konvertieren, wird es daher eine Reihe von Warnungen bezüglich Show_Registers, Hex_A usw. geben; diese Meldungen können ignoriert werden.
Berühren Sie
Während es für moderne Touchscreens nicht notwendig ist, kann es bei einigen älteren resistiven Touchscreens, die nur Single-Touch unterstützen, erforderlich sein, dass Sie auf tslib zurückgreifen, anstatt sich auf das Linux-Multi-Touch-Protokoll und die Event-Devices zu verlassen.
Um die Unterstützung von tslib zu aktivieren, setzen Sie die Umgebungsvariable QT_QPA_EGLFS_TSLIB (für eglfs) oder QT_QPA_FB_TSLIB (für linuxfb) auf 1. Um das Gerät zu ändern, setzen Sie die Umgebungsvariable TSLIB_TSDEVICE oder übergeben Sie den Gerätenamen über die Befehlszeile. Beachten Sie, dass der tslib input handler Mausereignisse generiert und nur Single-Touch unterstützt, im Gegensatz zu evdevtouch, der auch echte Multi-Touch QTouchEvent Ereignisse generiert.
Der evdev touch handler unterstützt die folgenden zusätzlichen Parameter:
| Parameter | Beschreibung |
|---|---|
/dev/input/... | Gibt den Namen des Eingabegerätes an. Wenn er nicht angegeben wird, sucht Qt entweder über libudev oder durch Durchlaufen der verfügbaren Knoten nach einem geeigneten Gerät. |
rotate | Bei einigen Touchscreens müssen die Koordinaten gedreht werden, indem rotate auf 90, 180 oder 270 gesetzt wird. |
invertx und inverty | Gibt die Parameter zur Invertierung der X- oder Y-Koordinaten in den Eingabeereignissen an. |
Wenn Sie beispielsweise die folgenden Werte an QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS übergeben, bevor Sie Anwendungen starten, haben Sie ein explizit angegebenes Touch-Gerät mit gedrehten Koordinaten. Dies ist nützlich, wenn die Ausrichtung des tatsächlichen Bildschirms und des Touchscreens nicht übereinstimmen.
export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event5:rotate=180
Stiftbasierte Tablets
Das Plugin evdevtablet bietet grundlegende Unterstützung für Wacom- und ähnliche stiftbasierte Tablets. Es erzeugt nur QTabletEvent Ereignisse. Um es zu aktivieren, übergeben Sie QT_QPA_GENERIC_PLUGINS=evdevtablet in der Umgebung oder alternativ das Argument -plugin evdevtablet in der Befehlszeile.
Das Plugin kann einen Geräteknoten-Parameter, wie z.B. QT_QPA_GENERIC_PLUGINS=evdevtablet:/dev/event1, annehmen, wenn die automatische Geräteerkennung von Qt (basierend auf libudev oder /dev/input/event*) nicht funktioniert oder ein Fehlverhalten aufweist.
Debuggen von Eingabegeräten
Es ist möglich, einige Informationen auf die Debug-Ausgabe zu drucken, indem man die qt.qpa.input Logging-Regel aktiviert, z.B. indem man die QT_LOGGING_RULES Umgebungsvariable auf qt.qpa.input=true setzt. Dies ist nützlich, um festzustellen, welches Gerät verwendet wird oder um Probleme bei der Geräteerkennung zu beheben.
Benutzerdefinierte Mauszeigerbilder verwenden
eglfs wird mit einem eigenen Satz von 32x32 großen Mauszeigerbildern geliefert. Wenn diese nicht ausreichen, können Sie einen benutzerdefinierten Cursor-Atlas bereitstellen, indem Sie die Umgebungsvariable QT_QPA_EGLFS_CURSOR auf den Namen einer JSON-Datei setzen. Diese Datei kann auch über das Qt Resource System in die Anwendung eingebettet werden.
Ein eingebetteter Cursor-Atlas mit 8 Cursor-Bildern pro Zeile kann zum Beispiel wie folgt angegeben werden:
{
"image": ":/cursor-atlas.png",
"cursorsPerRow": 8,
"hotSpots": [
[7, 2],
[12, 3],
[12, 12],
...
]
}Beachten Sie, dass die Bilder im Atlas dicht gepackt sein sollten; die Breite und Höhe der Cursor werden auf der Grundlage der Gesamtbildgröße und der Einstellung cursorsPerRow bestimmt. Atlanten müssen auch ein Bild für alle unterstützten Cursor bereitstellen.
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.