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:

ParameterBeschreibung
/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.
nocompressStandardmäß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.
dejitterLegt ein Jitter-Limit fest; standardmäßig deaktiviert.
grabWenn er auf 1 gesetzt ist, greift Qt auf das Gerät zu, um es exklusiv zu verwenden.
absEinige 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:

ParameterBeschreibung
/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.
grabAktiviert das Greifen des Eingabegerätes.
keymapLegt den Namen einer benutzerdefinierten Tastaturbelegungsdatei fest.
enable-composeErmöglicht Compositing.
repeat-delayLegt eine benutzerdefinierte Verzögerung für die Tastenwiederholung fest.
repeat-rateLegt 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 und LinuxFB die Terminaltastatur zu deaktivieren, indem sie den Tastaturmodus des Ttys auf K_OFF setzen. Dies verhindert, dass Tastenanschläge an das Terminal gesendet werden. Wenn das Standardverhalten erforderlich ist, setzen Sie die Umgebungsvariable QT_QPA_ENABLE_TERMINAL_KEYBOARD auf 1. Beachten Sie, dass dies nur funktioniert, wenn die Anwendung von einer entfernten Konsole aus gestartet wird, z. B. über ssh, und die Eingabe über die Terminaltastatur aktiviert bleibt.
  • Ein alternativer Ansatz ist die Verwendung des grab -Parameters des evdev -Tastaturhandlers durch Übergabe von grab=1 an QT_QPA_EVDEV_KEYBOARD_PARAMETERS. Dies führt dazu, dass versucht wird, einen Zugriff auf das Eingabegerät zu erhalten. Wenn der grab 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 kein getty 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 das kmap 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:

ParameterBeschreibung
/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.
rotateBei einigen Touchscreens müssen die Koordinaten gedreht werden, indem rotate auf 90, 180 oder 270 gesetzt wird.
invertx und invertyGibt 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.