首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >嵌入Qt鼠标指针未显示

嵌入Qt鼠标指针未显示
EN

Stack Overflow用户
提问于 2016-08-08 20:44:29
回答 2查看 4.9K关注 0票数 4

我这里有个有趣的问题。我发现了很多线程,人们在嵌入式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 ),但由于某种原因,触摸输入不能绑定到游标。

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

有没有人对在哪里寻找解决这个问题的方法有一些想法?

谢谢!伊恩

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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节点。这导致我设置了以下环境变量:

代码语言:javascript
运行
复制
QT_QPA_GENERIC_PLUGINS=evdevmouse
QT_QPA_EVDEV_MOUSE_PARAMETERS=/dev/input/mouse0

让我非常沮丧的是,这些环境变量导致了什么都没有。过了一段时间,我和我的团队找到了如何在我们的系统上从Qt源获得调试输出:

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

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

代码语言:javascript
运行
复制
QT_QPA_GENERIC_PLUGINS=evdevmouse
QT_QPA_EVDEV_MOUSE_PARAMETERS=/dev/input/event0

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

代码语言:javascript
运行
复制
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中,现在我们可以设置

代码语言:javascript
运行
复制
QT_QPA_GENERIC_PLUGINS=evdevmouse

我们得到一个工作鼠标指针与热插拔支持。

票数 7
EN

Stack Overflow用户

发布于 2016-08-26 09:37:57

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

HAVE_TOUCHSCREEN=1变量在machconfig文件中。它通常位于recipes-bsp/formfactor/formfactor目录中的BSP层中。将此设置为1使光标不可见。

尝试将其设置为0

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38838198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档