嵌入式Qt鼠标指针未显示

时间:2016-08-08 20:44:30

标签: linux qt driver framebuffer yocto

我在这里遇到了一些有趣的问题。有很多线程我发现人们正在努力隐藏或摆脱嵌入式Qt GUI上的光标......但我正在尝试将光标移到显示上嵌入式Qt GUI。

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

我已经搜索了Qt代码,那里没有任何东西可以隐藏光标。我在适当的QT_QPA_FB_HIDECURSOR = 0环境变量中添加了我的Qt启动脚本。我已经尝试在GUI中添加QCursor obejct。不幸的是,这些都没有奏效。使用QCusor我有时能够在屏幕上显示光标,但不依赖于触摸输入(光标显示在我以编程方式移动到的位置,但是当我与GUI交互时它停留在那里)

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

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

有没有人想到在哪里寻找这个问题的解决方案?

谢谢! 伊恩

2 个答案:

答案 0 :(得分:4)

所以,现在3个月后,我认为我和我的团队想出了一个可解决的问题。

解决方案的路径始于“使用libinput”上的Qt Documentation。文档归结为一些重要的陈述:

  

可以在环境变量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 *的演练)不起作用或行为不当。

所以,在我的系统中,我有设备节点: event0 event1 event2 event3 event4 event5 mouse mouse0 。因为我试图让鼠标工作,所以我假设我必须使用 mouse0 节点。这导致我设置这些环境变量:

QT_QPA_GENERIC_PLUGINS=evdevmouse
QT_QPA_EVDEV_MOUSE_PARAMETERS=/dev/input/mouse0

令我沮丧的是,这些环境变量一无所获。经过一段时间,我的团队和我想出了如何在我们的系统上从Qt源获得调试输出:

  • 修改yocto build下的qtbase目录中的源代码(粗略/ yocto / poky / build / tmp / work / temp build目录 / 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

但是,仍然存在无鼠标指针的问题。过了一会儿,我们回顾了Qt文档,特别是上面列出的第2段。作为最后的尝试,我们尝试添加QT_QPA_FB_HIDECURSOR环境变量......

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

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

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

  

只要... QT_QPA_FB_HIDECURSOR(对于linuxfb)未设置

,鼠标光标就会显示

通过“未设置”,Qt意味着明确定义为FALSE ...而不是简单地“未设置”。

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

  

每个“鼠标”设备都分配给一个鼠标或数字化仪,除了   最后一个 - '老鼠'。所有人都共享这个单字符设备   鼠标和数字化仪,即使没有连接,设备也是   当下。这对于热插拔USB鼠标很有用,所以程序   即使没有老鼠也可以打开设备。

这对我们来说意味着虽然我们可以使用 event0 (当我们拔掉鼠标时它会消失)我们的鼠标输入事件处理,但我们将无法支持热插拔进行一些内核/ Qt源修改或弄清楚如何使鼠标作为Qt鼠标输入参数工作。

所以,“为什么 event0 工作而不是 mouse0 / 鼠标”的问题仍然存在...但是现在我们'我们有一个可以忍受的解决方案。

更新:现在稍后我们发现udev在我们的系统上运行不正常。我们将ydev添加到我们的Yocto构建包组中的RDEPENDS,现在我们可以设置

QT_QPA_GENERIC_PLUGINS=evdevmouse

我们得到一个支持hotplug的鼠标指针。

答案 1 :(得分:0)

我不知道这是否适用于您的问题(我不使用QT),但有一个

HAVE_TOUCHSCREEN=1文件中的

machconfig变量。它通常位于recipes-bsp/formfactor/formfactor目录中的BSP层中。 将其设置为1会使光标不可见。

尝试将其设置为0