【问题标题】:Embedded Qt Mouse Pointer Not Showing Up嵌入式 Qt 鼠标指针未显示
【发布时间】:2016-12-14 18:13:38
【问题描述】:

我在这里遇到了一个有趣的问题。我发现有很多线程人们正在努力隐藏或摆脱嵌入式 Qt GUI 上的光标......但我试图让光标显示嵌入式 Qt 图形用户界面。

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

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

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

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

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

谢谢! 伊恩

【问题讨论】:

    标签: linux qt driver framebuffer yocto


    【解决方案1】:

    所以,现在 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* 的演练)不起作用或行为异常。


    所以,在我的系统中,我有设备节点:event0event1event2event3event4event5micemouse0。因为我试图让 mouse 工作,所以我假设我必须使用 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 directory/qtbase
    • 将 qtbase/plugins/generic/libqevdevmouseplugin.so 复制到我的硬件(大致 /usr/lib/qt5/plugins/generic)
    • 从命令行运行 Qt

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

    QT_QPA_GENERIC_PLUGINS=evdevmouse
    QT_QPA_EVDEV_MOUSE_PARAMETERS=/dev/input/event0
    

    但是,没有鼠标指针的问题仍然存在。过了一会儿,我们回顾了 Qt 文档,特别是上面列出的第二段。作为最后一次尝试,我们尝试添加 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 (for linuxfb) is not set

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

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

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

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

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

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

    QT_QPA_GENERIC_PLUGINS=evdevmouse
    

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

    【讨论】:

      【解决方案2】:

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

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

      尝试将其设置为0

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-11
        • 2021-08-31
        • 1970-01-01
        • 1970-01-01
        • 2020-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多