当前位置:首页 > 物联网 > 智能应用
[导读]在工业HMI、医疗仪器面板、车载中控等嵌入式场景,用户界面的流畅度和开发效率直接决定产品上市速度。Qt作为嵌入式Linux上最成熟的图形框架,凭借跨平台、信号槽机制、丰富的控件库和QML声明式UI,成为HMI开发的首选。本文从环境搭建、平台插件选择到Buildroot集成,梳理一条可落地的快速开发路径。


在工业HMI、医疗仪器面板、车载中控等嵌入式场景,用户界面的流畅度和开发效率直接决定产品上市速度。Qt作为嵌入式Linux上最成熟的图形框架,凭借跨平台、信号槽机制、丰富的控件库和QML声明式UI,成为HMI开发的首选。本文从环境搭建、平台插件选择到Buildroot集成,梳理一条可落地的快速开发路径。

为什么选Qt而非其他GUI

嵌入式GUI方案不少:LVGL轻量但生态偏小,GTK移植繁琐,而Qt的优势在于:一套代码可同时在x86主机和ARM目标板上编译运行,99%的界面调试在PC上完成,最后只需一次交叉编译部署到板子。Qt 5.0之后,旧的QWS自有窗口系统已被抛弃,单进程场景使用Qt Platform Abstraction(QPA),多进程场景通过Wayland支持。对绝大多数单应用全屏HMI而言,QPA机制配合EGLFS插件是最优解。

平台插件:EGLFS还是LinuxFB?

嵌入式Linux上的Qt支持多种平台插件:EGLFS、LinuxFB、Wayland等。它们的可用性取决于Qt的配置方式,在许多板卡上默认选择EGLFS。

EGLFS:在EGL和OpenGL ES 2.0上运行Qt应用,无需X11或Wayland窗口系统,是现代带GPU嵌入式设备的推荐插件。它强制第一个顶层窗口全屏,并将对话框、弹窗等所有其他顶层控件合成进去。

LinuxFB:直接写帧缓冲,无需GPU,适合无3D加速的低成本板卡。

Wayland:需要提供合成器,支持完整的多窗口系统。

切换插件只需一行环境变量或命令行参数:

# 方式一:环境变量

export QT_QPA_PLATFORM=eglfs

./my_hmi_app


# 方式二:命令行参数(快速测试)

./my_hmi_app -platform linuxfb:fb=/dev/fb0


# EGLFS指定帧缓冲设备

export QT_QPA_EGLFS_FB=/dev/fb1

宿主机开发环境

在Ubuntu PC上安装Qt Creator和交叉编译工具链:

# 安装Qt Creator

sudo apt update

sudo apt install build-essential qtcreator qt5-default qt5-qmake


# 安装ARM交叉编译器(以aarch64为例)

sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

在Qt Creator中配置交叉编译:打开"工具→选项→构建与运行",添加交叉编译器路径、Qt版本(指向交叉编译的qmake)和目标板的sysroot。Sysroot可从目标板根文件系统复制,包含ARM架构的头文件和库。

用QML快速构建HMI界面

QML声明式语法特别适合HMI开发,下面是个简易示波器界面的片段:

import QtQuick 2.15

import QtQuick.Controls 2.15


ApplicationWindow {

   visible: true

   width: 800; height: 480

   title: "工业监控HMI"


   Rectangle {

       anchors.fill: parent

       color: "#1a1a2e"


       Text {

           id: tempText

           anchors.centerIn: parent

           text: "温度: -- °C"

           font.pixelSize: 32

           color: "#00d2ff"

       }


       Timer {

           interval: 1000; running: true; repeat: true

           onTriggered: {

               // 从后端C++接收数据并更新

               tempText.text = "温度: " + backend.getTemperature() + " °C"

           }

       }


       Button {

           anchors.bottom: parent.bottom

           anchors.horizontalCenter: parent.horizontalCenter

           text: "紧急停机"

           onClicked: backend.emergencyStop()

       }

   }

}

C++后端通过QObject派生类暴露接口给QML,利用信号槽实现数据绑定:

class HMIBackend : public QObject {

   Q_OBJECT

public:

   Q_INVOKABLE double getTemperature() { return read_sensor(); }

   Q_INVOKABLE void emergencyStop() { /* 控制逻辑 */ }

signals:

   void temperatureChanged(double val);

};

用Buildroot打包完整镜像

Buildroot通过交叉编译生成嵌入式Linux系统,能处理交叉编译工具链、根文件系统生成、内核镜像编译和bootloader编译,且支持Qt5等数千个包。集成Qt应用的典型步骤:

make menuconfig中进入"Target packages → Graphics libraries and applications",启用Qt5基础库及所需模块

创建自定义包目录package/my_hmi/,编写my_hmi.mk:

define MY_HMI_INSTALL_TARGET_CMDS

   $(INSTALL) -D -m 0755 $(@D)/my_hmi $(TARGET_DIR)/opt/my_hmi/

   echo "export QT_QPA_PLATFORM=eglfs" >> $(TARGET_DIR)/etc/profile.d/qt.sh

endef

在/etc/init.d/添加启动脚本S99hmi,上电自动运行应用

执行make后,Buildroot生成一个包含内核、根文件系统的完整镜像,烧录到eMMC或SD卡即可。

部署与调优

将交叉编译好的可执行文件传到目标板:

scp my_hmi_app root@192.168.1.100:/opt/my_hmi/

ssh root@192.168.1.100

export QT_QPA_PLATFORM=eglfs

/opt/my_hmi/my_hmi_app &

常见问题处理:

触摸屏校准:电阻屏需运行ts_calibrate和ts_test

中文字体:将文泉驿等中文字体库打包进根文件系统,并在Qt程序中设置字体

性能优化:EGLFS下鼠标光标通过OpenGLES渲染可能较慢,可考虑硬件光标

写在最后

从Qt Creator设计界面,到交叉编译,再到Buildroot打包完整镜像——这条开发链条最大的价值在于"PC上所见即板子上所得"。开发者无需反复烧板调试,界面逻辑在x86主机上充分验证后,一次交叉编译即可部署。对于带GPU的现代ARM板(如i.MX8、RK3568、Allwinner R528),EGLFS插件能充分发挥硬件加速能力,让Qt HMI的动画流畅度媲美消费电子产品。掌握这套方法论,一个工业HMI项目的GUI开发周期可以从传统的数周压缩到几天。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读

在物联网浪潮中,蓝牙低功耗(BLE)凭借其极低的功耗和便捷的连接方式,成为传感器、穿戴设备、智能家居的首选无线协议。在嵌入式Linux平台上,BlueZ是官方蓝牙协议栈,它提供了从HCI层到GATT层的完整API。本文以...

关键字: BLE驱动 嵌入式Linux BlueZ

在物联网终端、便携医疗设备和野外传感器中,电池续航往往是产品成败的关键。嵌入式Linux虽然功能强大,但其默认配置偏向性能而非节能——CPU始终运行在高频、外设持续供电、内核定时器频繁唤醒。通过系统级的功耗调优,将续航延...

关键字: 嵌入式Linux 低功耗优化 电池续航

传统PLC硬件专机价格高、扩展性受限,而ARM+Linux平台成本低、生态丰富。将PLC的梯形图/ST逻辑解释为软件运行时,在ARM Linux上执行,既能保留PLC的可靠性思维,又能利用Linux的网络、存储和图形能力...

关键字: 软PLC 嵌入式Linux ARM

在Zynq、ZU+等SoC FPGA平台上,ARM处理器系统(PS)与可编程逻辑(PL)通过AXI总线紧耦合,让"Linux跑应用+FPGA做加速"成为嵌入式异构计算的主流范式。两者分工清晰:PS负责网络协议、文件系统、...

关键字: 嵌入式Linux FPGA 软硬件协同

当AI模型从云端下沉到产线相机、无人机、农业传感器等边缘节点,算力受限、功耗敏感、实时性要求高成为新常态。轻量模型(MobileNet、YOLO-Nano、TinyBERT)搭配推理加速引擎,可以在几瓦功耗下实现毫秒级推...

关键字: 边缘计算 AI推理 嵌入式Linux

当嵌入式项目从“跑个Demo”走向量产,Buildroot的简洁往往不够用——你需要精确控制内核版本、库的ABI兼容性、安全补丁的追溯,甚至为不同SKU生成差异化的镜像。Yocto正是为此而生:它不是一套固化的系统,而是...

关键字: Yocto 嵌入式Linux 自定义发行版

很多刚接触嵌入式Linux的工程师看到arch/arm64/boot/dts/下成片的.dts、.dtsi文件就头大。其实设备树(Device Tree)本质就是一份"硬件简历"——用树形结构告诉内核:板子上有啥外设、挂...

关键字: 设备树 DTS 嵌入式Linux

在SPI NOR Flash只有16MB、甚至8MB的嵌入式板上,每一次字节都很贵。Buildroot的优势在于:一条make menuconfig就能通过交叉编译生成工具链、根文件系统和内核镜像,帮开发者把"臃肿"挡在...

关键字: Buildroot 根文件系统 嵌入式Linux

设备树(Device Tree, DTB)是嵌入式Linux系统中描述硬件的“骨架”。一个错误的status、一个拼错的compatible,就可能导致外设驱动无法加载或系统崩溃。本文总结十个在ARM/Linux设备树编...

关键字: 嵌入式Linux 设备树

在嵌入式Linux开发中,设备树(Device Tree)已成为描述硬件的标准。它让内核与硬件解耦,实现“一份内核,适配万千板卡”。本文将跳过繁杂的理论,直击设备树节点编写与内核驱动匹配的核心流程。

关键字: 嵌入式Linux 设备树 Device Tree
关闭