我这里有个有趣的问题。我发现了很多线程,人们在嵌入式Qt GUI...but上隐藏或删除游标,我正试图让游标显示在嵌入式Qt上。
一段时间前,我继承了一个“完成”的项目,而在这个项目上做最多工作的人已经离开了。快到今天,就需要在这个功能触摸屏GUI中添加一个游标。系统操作系统是Yocto,它正在框架缓冲区上运行一个QT5.4应用程序。
我已经浏览了Qt代码,没有任何东西可以隐藏光标。我将适当的QT_QPA_FB_HIDECURSOR=0环境变量添加到Qt启动脚本中。我已经尝试过在GUI中添加一个QCursor命令。不幸的是,所有这些都不起作用。使用QCusor,我有时能够在屏幕上获得一个游标,但没有绑定到触摸输入(光标显示在我编程移动它的位置,但当我与GUI交互时,它就会停留在那里)。
我的触摸输入事件被绑定到Qt中(通过QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event9:rotate=180),和QT_QPA_GENERIC_PLUGINS=evdevtouch ),但由于某种原因,触摸输入不能绑定到游标。
在这一点上,我花了几天时间来处理环境变量和启动脚本修改,但是我所做的一切都没有得到我想要的结果。
有没有人对在哪里寻找解决这个问题的方法有一些想法?
谢谢!伊恩
发布于 2016-10-27 21:57:21
所以,三个月后,我想我的团队和我刚刚想出了一个解决这个问题的可行的办法。
通往解决方案的道路是从“使用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的自动设备发现(基于libudev或/dev/ not /event*的演练)没有功能或行为不正常,则使用QT_QPA_GENERIC_PLUGINS=evdevtablet:/dev/event1,。
因此,在我的系统中,我有设备节点: event0、event1、event2、event3、event4、event5、鼠标和mouse0。因为我试图让鼠标正常工作,所以我假设必须使用mouse0节点。这导致我设置了以下环境变量:
QT_QPA_GENERIC_PLUGINS=evdevmouse
QT_QPA_EVDEV_MOUSE_PARAMETERS=/dev/input/mouse0
让我非常沮丧的是,这些环境变量导致了什么都没有。过了一段时间,我和我的团队找到了如何在我们的系统上从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
And...voila!经过无数个小时的调试和阅读文档,我们终于得到了一个鼠标指针。
我认为我们问题的主要症结是误解了Qt文档。
鼠标光标出现在.QT_QPA_FB_HIDECURSOR (用于linuxfb)是未设置
所谓"not“,Qt的意思是显式地定义为FALSE...not --根本就是"not”。
这个解决方案对我们来说是可行的,但它确实留下了至少一个有待改进的地方。一路走来,我偶然发现了这个线程在Unix StackEx上回答,它指向了输入/输入的内核文档。在“3.2.2mousedev”一节中,您可以看到一行:
每个“鼠标”设备都被分配给一个鼠标或数字化器,除了最后一个--“鼠标”。这个单字符设备由所有的鼠标和数字化器共享,即使没有连接,设备也是存在的。这是有用的热插拔USB鼠标,以便程序可以打开设备,即使没有鼠标存在。
这对我们来说意味着,虽然我们可以使用event0 (当我们拔掉鼠标的时候)来处理鼠标输入事件,但是如果不对内核/ Qt源代码进行一些修改,或者找出如何让鼠标作为Qt鼠标输入参数,我们就无法支持热插拔。
因此,“为什么event0工作而不是鼠标0/老鼠”的问题仍然是stands...but,现在我们有了一个我们可以接受的解决方案。
更新:稍后,我们发现udev在我们的系统上没有正常工作。我们在Yocto构建的包组中将udev添加到RDEPENDS中,现在我们可以设置
QT_QPA_GENERIC_PLUGINS=evdevmouse
我们得到一个工作鼠标指针与热插拔支持。
发布于 2016-08-26 09:37:57
我不知道这是否适用于您的问题(我不使用QT),但有一个
HAVE_TOUCHSCREEN=1
变量在machconfig
文件中。它通常位于recipes-bsp/formfactor/formfactor
目录中的BSP层中。将此设置为1
使光标不可见。
尝试将其设置为0
https://stackoverflow.com/questions/38838198
复制相似问题