嵌入式Qt鼠标指针未显示

iwi*_*ann 3 linux qt framebuffer driver yocto

我这里有一个有趣的问题。我发现了很多线程,人们可以在其中隐藏或摆脱嵌入式Qt GUI上的游标...但是我试图使游标显示在嵌入式Qt GUI上。

我继承了一个在一段时间前“完成”的项目,而在该项目上做最多工作的人已经继续前进。快进到今天,需要在此功能性触摸屏GUI中添加光标。系统操作系统是Yocto Linux,并且在帧缓冲区上运行Qt 5.4应用程序。

我已经搜索了Qt代码,那里没有任何东西可以隐藏光标。我已经在Qt启动脚本中添加了适当的QT_QPA_FB_HIDECURSOR = 0环境变量。我已经尝试过向GUI添加QCursor对象。不幸的是,这些都不起作用。使用QCusor,我有时可以在屏幕上向上移动光标,但并不局限于触摸输入(光标显示在我以编程方式将其移动到的位置,但是当我与GUI交互时会停留在该位置) 。

我的触摸输入事件绑定到Qt(通过QT_QPA_GENERIC_PLUGINS = evdevtouch和QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS = / dev / input / event9:rotate = 180),但是由于某些原因触摸输入无法绑定到光标。

在这一点上,我花了几天时间弄乱环境变量和启动脚本修改,但是我所做的一切都没有得到我想要的结果。

是否有人在哪里寻找解决此问题的方法的想法?

谢谢!伊恩

iwi*_*ann 6

因此,现在三个月后,我认为我的团队和我才想出了一个解决该问题的可行方法。

解决方案的途径始于有关“使用libinput” 的Qt文档。该文档归纳为以下重要声明:

可以在环境变量QT_QPA_EVDEV_MOUSE_PARAMETERS,QT_QPA_EVDEV_KEYBOARD_PARAMETERS和QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS中设置设备节点名称之类的参数


只要未设置QT_QPA_EGLFS_HIDECURSOR(对于eglfs)或QT_QPA_FB_HIDECURSOR(对于linuxfb),并且Qt基于libudev的设备发现报告至少有一只鼠标可用,就会显示鼠标光标。当不存在libudev支持时,除非通过环境变量明确禁用,否则鼠标光标始终显示。


evdevtablet插件为Wacom和类似的基于笔的平板​​电脑提供基本支持。它仅生成QTabletEvent事件。要启用它,请在环境中传递QT_QPA_GENERIC_PLUGINS = evdevtablet,或者在命令行中传递-plugin evdevtablet参数。该插件可以使用设备节点参数,例如QT_QPA_GENERIC_PLUGINS = evdevtablet:/ dev / event1,以防Qt的自动设备发现(基于libudev或/ dev / input / event *的演练)不起作用或行为异常。


因此,在我的系统中,我具有设备节点:event0event1event2event3event4event5micemouse0。因为我正在尝试使鼠标正常工作,所以我假设必须使用mouse0节点。这导致我设置以下环境变量:

QT_QPA_GENERIC_PLUGINS=evdevmouse
QT_QPA_EVDEV_MOUSE_PARAMETERS=/dev/input/mouse0
Run Code Online (Sandbox Code Playgroud)

这些环境变量令我非常沮丧。一段时间后,我的团队和我弄清楚了如何从系统上的Qt源获取调试输出:

  • 在yocto构建下的qtbase目录中修改源代码(大致为/ yocto / poky / build / tmp / work / temp构建目录 / qtbase
  • 将qtbase / plugins / generic / libqevdevmouseplugin.so复制到我的硬件(大致为/ usr / lib / qt5 / plugins / generic)
  • 从命令行运行Qt

我们很快发现,来自的输入事件mouse0小鼠基本上是垃圾数据。在我们的系统上,我们确实在内核中设置了EVDEV,因此鼠标输入也与设备节点event0绑定在一起。当我们尝试将Qt鼠标参数设置为event0时,我们开始看到看起来像真实数据的调试输出。

QT_QPA_GENERIC_PLUGINS=evdevmouse
QT_QPA_EVDEV_MOUSE_PARAMETERS=/dev/input/event0
Run Code Online (Sandbox Code Playgroud)

但是,仍然没有鼠标指针的问题。一段时间后,我们回顾了Qt文档,特别是上面列出的第二段。作为最后一次尝试,我们尝试添加QT_QPA_FB_HIDECURSOR环境变量...

QT_QPA_GENERIC_PLUGINS=evdevmouse
QT_QPA_EVDEV_MOUSE_PARAMETERS=/dev/input/event0
QT_QPA_FB_HIDECURSOR=0
Run Code Online (Sandbox Code Playgroud)

还有...瞧!经过无数小时的调试和阅读文档,我们终于有了鼠标指针。

我认为我们问题的主要症结在于误解了Qt文档。

只要未设置 ... QT_QPA_FB_HIDECURSOR(对于linuxfb),就会显示鼠标光标

通过“未设置”,Qt表示显式定义为FALSE ...根本不是简单的“未设置”。

此解决方案将对我们有用,但确实至少需要一件事情。在此过程中,我偶然发现了Unix StackEx上的该线程答案,该答案指向input / input.txt的内核文档。在“ 3.2.2 mousedev”部分中,您可以看到以下行:

每个“鼠标”设备都分配给一个鼠标或数字转换器,最后一个鼠标除外。所有鼠标和数字转换器都共享该单字符设备,即使没有连接,也存在该设备。这对于热插拔USB鼠标很有用,这样即使没有鼠标,程序也可以打开设备。

这对我们而言意味着的是,尽管我们可以使用event0(拔出鼠标后会消失)进行鼠标输入事件处理,但是如果不进行一些内核/ Qt源修改或弄清楚,我们将无法支持热插拔。了解如何使鼠标作为Qt鼠标输入参数工作。

所以,这个问题:“为什么EVENT0工作,而不是mouse0 / ”依然屹立......但现在我们已经有了,我们可以住在一起的解决方案。

更新:现在过了一会儿,我们发现udev在我们的系统上无法正常工作。在Yocto构建的软件包组中,我们将udev添加到了RDEPENDS中,现在我们可以设置

QT_QPA_GENERIC_PLUGINS=evdevmouse
Run Code Online (Sandbox Code Playgroud)

并且我们获得了带有热插拔支持的有效鼠标指针。