Eingaben auf einem Embedded-Linux-Gerät
Auf Ihrem Embedded-Linux-Gerät werden Maus-, Tastatur- und Berührungseingaben direkt über evdev
oder mit Hilfe von Hilfsbibliotheken wie libinput
oder tslib
gelesen, wenn kein Fenstersystem vorhanden ist. Dieses Verhalten setzt jedoch voraus, 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.
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 entweder über libudev oder durch Durchlaufen der verfügbaren Knoten nach einem geeigneten Gerät. |
nocompress | Standardmäßig werden Eingabeereignisse, die nicht zu einer Änderung der Position gegenüber dem letzten Qt-Mausereignis führen, komprimiert. Ein neues Qt-Mausereignis wird erst nach einer Änderung der Position oder des Tastenzustands 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
EGLFS
undLinuxFB
die Terminaltastatur zu deaktivieren, indem sie den Tastaturmodus des Ttys aufK_OFF
setzen. Dies verhindert, dass Tastenanschläge an das Terminal gesendet werden. Wenn das Standardverhalten erforderlich ist, setzen Sie die UmgebungsvariableQT_QPA_ENABLE_TERMINAL_KEYBOARD
auf1
. 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=1
anQT_QPA_EVDEV_KEYBOARD_PARAMETERS
. Dies führt dazu, dass versucht wird, einen Zugriff auf das Eingabegerät zu erhalten. Wenn dergrab
erfolgreich 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_GETTYS
dazu, dass keingetty
Prozess 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
ckbcomp
Dienstprogramm in daskmap
Format konvertiert werden. - Da es sich bei
kmap
um 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äts 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 Mauszeiger-Bilder 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.