3.20. sample_qt 使用说明

3.20.1. 功能概述

sample_qt一个基于 Qt + DRM eglfs 的 UI 示例程序,用于演示芯片通过 Qt 构建图形界面、完成图形渲染响应输入事件完整流程。

  • 验证显示路径:Qt 通过 eglfs/DRM 直接渲染屏幕,验证 DRM 显示链路是否正常工作。

  • 验证输入路径:通过触摸屏、鼠标键盘输入设备界面交互,验证输入事件是否被 Qt 程序正确接收处理。

  • 参考实现:为后续平台开发 Qt 图形应用提供基础工程模板代码参考。

3.20.1.1. 软件架构说明

sample_qt整体软件架构如下所示:

software_architecture_diagram

从上到下主要包含以下几个层次:

  • main.cpp 源码层:包含 qt_main、“初始化 Qt 应用”、“创建界面”、“进入事件循环”等步骤,通过这些函数依次完成 Qt 应用初始化、界面创建最终进入事件循环。

  • Qt 框架层:由 QGuiApplication/QApplication 对象、界面窗口控件、Qt 输入事件分发、Qt 渲染处理模块组成,负责管理应用生命周期、展示界面以及处理来自用户输入事件。

  • Qt 平台插件层:包含 eglfs 平台插件evdev 输入插件,前者将 Qt 的渲染结果输出到 DRM/KMS 提供显示设备上,后者输入设备读取事件交给 Qt 框架进行分发。

  • 显示输入硬件层:底部为 DRM/KMS 子系统(/dev/dri)及其下方底层显示驱动、面板桥接芯片驱动(如 panel-wh-cm480 等),以及触摸屏、鼠标、键盘输入设备(/dev/input/event*),共同完成最终图像显示输入采集。

3.20.1.2. 代码位置目录结构

  • 代码位置:app/samples/platform_samples/sample_qt

  • 目录结构:

sample_qt/
├── README.md
├── eglfs_kms_config.json
├── main.cpp
├── run.sh
└── Makefile.bak
  • main.cpp:Qt 应用程序入口主要逻辑代码。

  • eglfs_kms_config.json:eglfs KMS 相关配置文件,用于指定输出设备、分辨率参数(具体内容实际文件为准)。

  • run.sh:在开发环境中运行示例程序辅助脚本。

  • README.md:源码目录简要说明文档。

  • Makefile.bak:备份的 Makefile 文件,实际编译需要更名Makefile 文件。

3.20.1.3. API 流程说明

image-20250110-165856.png

示例典型调用流程如下:

  1. Qt 应用初始化:

    • main.cpp创建 QGuiApplicationQApplication 对象,完成 Qt 运行环境基础初始化(包括平台插件、字体、翻译等)。

  2. 界面创建渲染:

    • 创建窗口场景,添加基本控件绘制元素,用于展示 Qt 渲染效果输入响应。

    • 设置窗口全屏显示,适配当前 DRM 输出分辨率。

  3. 平台显示适配:

    • 通过 Qt 的 eglfs 平台插件,将渲染目标绑定到 DRM framebuffer,并根据 eglfs_kms_config.json配置选择输出设备模式。

  4. 事件循环输入处理:

    • 进入 Qt 主事件循环,持续/dev/input/event*设备读取输入事件(通过 Qt 输入插件完成),并分发给对应窗口控件。

  5. 资源释放退出:

    • 用户退出程序系统发出退出信号时,Qt 应用退出事件循环,释放窗口相关资源,最终正常结束进程。

如需进一步了解代码具体函数调用关系,可以结合 main.cpp 源码和 Qt 官方文档阅读。

3.20.2. 编译部署

3.20.2.1. 编译

sample_qt 作为 BSP 工程一部分进行编译,推荐通过 BSP 提供编译框架完成构建:

  • 整体编译 BSP(包括所有示例):

./bd.sh
  • 编译 app/samples/platform_samples示例(包含 sample_qt):

./bd.sh app samples/platform_samples

⚠️ 重要提醒:如需运行 sample_qt 示例,必须使用带有 QT5 支持文件系统!

当前 BSP 默认提供的 rootfs 镜像(system rootfs)含 QT5 相关依赖,直接刷写无法运行任何 Qt 程序。请务必参考 “制作 QT支持” 一节,编译刷写包含 QT5 支持专用 rootfs 镜像,否则 Qt 示例无法使用。

此外,sample_qt 源码目录默认提供 Makefile.bak 文件,实际编译示例重命名Makefile

3.20.2.2. 程序部署

完成 BSP 编译刷写系统软件镜像后,本示例可执行文件安装开发板/app/platform_samples/sample_qt 目录下:

  • 可执行程序:/app/platform_samples/sample_qt/sample_qt

如果开发环境手工编译生成可执行文件,也可以整个 sample_qt 目录(包括必要配置资源文件)拷贝到开发板/userdata目录下,赋予执行权限手动运行:

chmod +x sample_qt
./sample_qt

3.20.3. 运行

3.20.3.1. 程序运行方法

运行示例之前,需要完成 DRM/eglfs 显示环境准备工作。

  1. 确认 DRM 设备节点:

    • 使用命令检查是否存在 /dev/dri 相关设备节点:

    ls /dev/dri
    
    • 如果存在 /dev/dri 设备节点,需要加载相关内核模块:

    modprobe drm_kms_helper
    modprobe vs_x5_syscon_bridge
    modprobe vs_drm
    modprobe panel-wh-cm480
    modprobe panel-jc-050hd134
    modprobe sii902x
    modprobe lontium-lt8618
    
  2. 配置 Qt 平台插件(如需要):

    • 示例使用 drm eglfs 显示栈,如果系统中未默认启用 eglfs,可以运行设置环境变量:

    export QT_QPA_PLATFORM=eglfs
    
  3. 确认输入设备:

    • 检查触摸屏、鼠标、键盘输入设备是否系统可见:

    ls /dev/input/event*
    
  4. 板端运行程序:

    • 安装目录直接运行:

    cd /app/platform_samples/sample_qt
    ./sample_qt
    
    • 可以使用 run.sh 脚本运行:

    ./run.sh
    

3.20.3.2. 程序参数选项说明

3.20.3.3. 运行效果

成功运行 sample_qt 后,开发板连接屏幕显示一个基于 Qt 的简单菜单界面:

  • 界面左上角显示提示文字:选择操作:

  • 提示文字下方纵向排列 4 个按钮,每个按钮整行,按钮文字依次为:

    • 按钮 1:提示

    • 按钮 2:问候

    • 按钮 3:关于

    • 按钮 4:关闭

  • 按钮采用条状布局,整体背景深色,按钮区域为略条带,并配以浅色文字,便于屏幕清晰辨认。

触摸屏点击不同按钮(或使用鼠标/触摸屏确认)时:

  • 当前点击按钮明显高亮状态变化,表示已经选中。

  • 程序根据按钮功能执行对应逻辑,例如:

    • 点击“按钮 1:提示”显示提示信息。

    • 点击“按钮 2:问候”显示问候信息。

    • 点击“按钮 3:关于”显示关于信息。

    • 点击“按钮 4:关闭”则退出示例程序关闭界面。

串口终端上,可以看到类似下面日志输出,表明 Qt 应用正常启动进入事件循环:

root@buildroot:/app/platform_samples/sample_qt# ./run.sh
QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'

如果屏幕能够正常显示上述菜单界面,并且点击按钮界面明显响应、程序行为按钮含义一致日志异常报错,即表明 sample_qt 示例运行正常。

3.20.4. 常见问题

3.20.4.1. 启动时报不到 DRM 设备或 Qt 平台插件

  • 问题描述:

    • 执行 ./sample_qt提示无法打开 DRM 设备,或提示不到 eglfs 平台(如 “Could not find the Qt platform plugin “eglfs”” 等)。

  • 可能原因:

    • 内核加载相关 DRM/显示驱动,导致 /dev/dri 设备节点存在。

    • Qt 运行环境正确配置 eglfs 平台插件。

  • 解决方法:

    • 按“程序运行方法”章节步骤,检查加载以下内核模块:

      modprobe drm_kms_helper
      modprobe vs_x5_syscon_bridge
      modprobe vs_drm
      modprobe panel-wh-cm480
      modprobe panel-jc-050hd134
      modprobe sii902x
      modprobe lontium-lt8618
      
    • 必要,设置 Qt 平台环境变量:

      export QT_QPA_PLATFORM=eglfs