2016-08-08 59 views
1

Ich habe ein bisschen ein interessantes Problem hier. Es gibt viele Threads, die ich gefunden habe, wo Leute arbeiten, um einen Cursor auf einer eingebetteten Qt GUI zu verstecken oder loszuwerden ... aber ich versuche, einen Cursor auf auf einer eingebetteten Qt GUI zu bekommen.Embedded Qt Mauszeiger nicht angezeigt

Ich habe ein Projekt geerbt, das vor einiger Zeit "beendet" wurde, und die Person, die am Projekt am meisten gearbeitet hat, ist weitergezogen. Schneller Vorlauf bis heute und es ist notwendig, dieser funktionellen Touchscreen-GUI einen Cursor hinzuzufügen. Das System OS ist Yocto Linux und es läuft eine Qt 5.4 Anwendung auf einem Framebuffer.

Ich habe den Qt-Code durchforstet und dort ist nichts, was einen Cursor verbergen würde. Ich habe die entsprechende Umgebungsvariable QT_QPA_FB_HIDECURSOR = 0 zu meinem Qt-Startskript hinzugefügt. Ich habe mit dem Hinzufügen eines QCursor-Objekts zur GUI experimentiert. Leider funktioniert keines dieser Dinge. Mit dem QCusor kann ich manchmal einen Cursor auf den Bildschirm bringen, ist aber nicht an die Touch-Eingabe gebunden (der Cursor erscheint an der Position, zu der ich ihn programmatisch bewege, bleibt aber dort, wenn ich mit der GUI interagiere) .

Meine Touch-Eingabe-Ereignisse werden in Qt gebunden (via QT_QPA_GENERIC_PLUGINS = evdevtouch und QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS =/dev/input/event9: drehen = 180), aber aus irgendeinem Grund, die Eingabe berühren kann nicht auf einen Cursor gebunden werden.

An diesem Punkt habe ich ein paar Tage mit Umgebungsvariablen und Startskriptänderungen herumgespielt, aber nichts, was ich getan habe, hat das Ergebnis, das ich suche.

Hat jemand da draußen einige Ideen, wo man nach Lösungen für dieses Problem suchen kann?

Danke! Ian

Antwort

3

So, jetzt 3 Monate später denke ich mein Team Einstellung und ich kam gerade mit einem passablen Lösung für dieses Problem auf.

Der Pfad zur Lösung begann mit der Qt Documentation auf "Using libinput". Die Dokumentation läuft darauf hinaus, ein paar wichtige Aussagen nach unten:

Parameter wie die Geräteknotennamen können in den Umgebungsvariablen QT_QPA_EVDEV_MOUSE_PARAMETERS eingestellt werden, QT_QPA_EVDEV_KEYBOARD_PARAMETERS und QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS


Der Mauszeiger zeigt nach oben immer wenn QT_QPA_EGLFS_HIDECURSOR (für eglfs) oder QT_QPA_FB_HIDECURSOR (für linuxfb) nicht gesetzt ist und Qt's libudev-basierte Geräteerkennung meldet, dass mindestens eine Maus verfügbar ist. Wenn die libudev-Unterstützung nicht vorhanden ist, wird der Mauszeiger immer angezeigt, sofern er nicht explizit über die Umgebungsvariable deaktiviert wird.


Das evdevtablet Plugin bietet grundlegende Unterstützung für Wacom und ähnliche, stiftbasierte Tabletten. Es generiert nur QTabletEvent-Ereignisse. Um es zu aktivieren, übergeben Sie QT_QPA_GENERIC_PLUGINS = evdevtablet in der Umgebung oder übergeben Sie alternativ das Argument -plugin evdevtablet in der Befehlszeile. Das Plugin kann einen Geräteknotenparameter verwenden, zum Beispiel QT_QPA_GENERIC_PLUGINS = evdevtablet:/dev/event1, falls die automatische Geräteerkennung des Qt (basierend auf libudev oder einem Walkthrough von/dev/input/event *) nicht funktioniert oder sich nicht benimmt.


Also, in meinem System habe ich den Geräteknoten: event0, event1, event2, event3, EVENT4, event5, Mäuse und Maus0. Weil ich versuche, die Maus arbeiten zu lassen, machte ich die Annahme, dass ich den Knoten mouse0 verwenden müsste. Dies führte dazu, dass ich diese Umgebungsvariablen einstellte:

QT_QPA_GENERIC_PLUGINS=evdevmouse 
QT_QPA_EVDEV_MOUSE_PARAMETERS=/dev/input/mouse0 

Sehr zu meiner Frustration führten diese Umgebungsvariablen zu nichts. Nach einiger Zeit dachte ich und mein Team, wie die Debug-Ausgabe von Qt Quelle auf unserem System zu erhalten:

  • Ändern Quellcode im qtbase Verzeichnis unter unserem yocto Build (grob/yocto/poky/build/tmp/Arbeit/Temp Bauverzeichnis/qtbase
  • Kopieren qtbase/plugins/generic/libqevdevmouseplugin.so meiner Hardware (etwa/usr/lib/QT5/plugins/generic)
  • Qt von der Kommandozeile Lauf

Wir fanden schnell heraus, dass die Eingabe eve nts kommen aus mouse0 und Mäuse waren im Grunde Müll Daten. Auf unserem System haben wir EVDEV im Kernel eingerichtet, so dass die Mauseingabe auch an den Geräteknoten event0 gebunden war. Als wir versuchten, den Qt-Mausparameter auf event0 zu setzen, fingen wir an, Debugausgabe zu sehen, die wie echte Daten aussah.

QT_QPA_GENERIC_PLUGINS=evdevmouse 
QT_QPA_EVDEV_MOUSE_PARAMETERS=/dev/input/event0 

Allerdings blieb das Problem des No-Maus-Pointer noch. Nach einer Weile schauten wir uns die Qt-Dokumentation an, speziell im 2. Absatz oben. Als letzten Versuch fügen wir versuchen, in der QT_QPA_FB_HIDECURSOR Umgebungsvariable ...

QT_QPA_GENERIC_PLUGINS=evdevmouse 
QT_QPA_EVDEV_MOUSE_PARAMETERS=/dev/input/event0 
QT_QPA_FB_HIDECURSOR=0 

Und ... voila! Nach unzähligen Stunden Debugging und Lesen der Dokumentation haben wir endlich einen Mauszeiger bekommen.

Ich denke, der Hauptpunkt unseres Problems war die Fehlinterpretation der Qt-Dokumentation.

Der Mauszeiger erscheint immer dann, wenn ...QT_QPA_FB_HIDECURSOR (für linuxfb) ist nicht gesetzt

Mit „nicht festgelegt“, bedeutet Qt explizit als FALSCH definiert ... nicht einfach „nicht gesetzt“ überhaupt.

Diese Lösung wird für uns funktionieren, aber es lässt mindestens eine Sache zu wünschen übrig. Auf dem Weg stolperte ich über this thread answer on the Unix StackEx, die auf die Kernel-Dokumentation von input/input.txt zeigt. Im Abschnitt „3.2.2 mousedev“ können Sie die Zeile sehen:

Jedes ‚Maus‘ Gerät mit einem einzigen Maus oder Digitizer zugeordnet ist, mit der Ausnahme die letzte - ‚Mäuse‘. Dieses Gerät mit einem einzelnen Zeichen wird von allen Mäusen und Digitizern gemeinsam genutzt, und selbst wenn keine angeschlossen sind, ist das Gerät vorhanden. Dies ist nützlich für das Hotplugging von USB-Mäusen, so dass die Programme das Gerät auch dann öffnen können, wenn keine Mäuse vorhanden sind.

Was das für uns bedeutet, dass, während wir event0 verwenden können (was geht weg, wenn wir die Maus ziehen) für unsere Mauseingabe Event-Handling, werden wir nicht in der Lage sein, Hot-Plugging zu unterstützen, ohne etwas zu machen Kernel/Qt-Source-Modifikationen oder herauszufinden, wie man Mäuse Arbeit als Qt-Maus-Eingabeparameter.

Also, die Frage nach dem „Warum tut event0 Arbeit und nicht mouse0/Mäuse“ steht immer noch ... aber jetzt haben wir eine Lösung haben wir mit leben können.

UPDATE: Jetzt ein wenig später haben wir herausgefunden, dass udev nicht richtig auf unserem System funktioniert. Wir haben udev den rdepends in unserer Paketgruppe für das Yocto bauen, und jetzt können wir

QT_QPA_GENERIC_PLUGINS=evdevmouse 

gesetzt und wir eine Arbeits Mauszeigers mit Hotplug-Unterstützung.

0

Ich weiß nicht, ob dies für Ihr Problem gilt (i QT nicht verwenden), aber es gibt ein

HAVE_TOUCHSCREEN=1 Variable in der machconfig Datei. Es befindet sich normalerweise in Ihrem BSP-Layer in einem Verzeichnis recipes-bsp/formfactor/formfactor. Wenn Sie diese Einstellung auf 1 setzen, wird der Cursor unsichtbar.

versuchen, es zu 0