工控界面方案选型:QT5/QT6 轻量化窗口、无屏纯后台两种开发模式
📅 2026/7/25 1:21:13
👁️ 阅读次数
📝 编程学习
工控界面方案选型:QT5/QT6 轻量化窗口、无屏纯后台两种开发模式
有些工控设备需要人机界面(HMI),有些就是闷头干活不带屏幕。选哪种方案?今天把两条路都铺开,让你少走弯路。
一、工控设备两大模式
工控设备的形态决定界面方案:
| 模式 | 典型场景 | 硬件要求 | 开发复杂度 |
|---|---|---|---|
| 有屏 UI(HMI) | 工业平板、机床面板、温室控制柜 | 显示屏+触摸屏+GPU(可选) | 中高 |
| 无屏纯后台 | 数据采集网关、远程I/O模块、环境监测节点 | 无显示屏,有串口+网络 | 低 |
选方案不是拍脑袋,先看项目有没有"人要操作设备"这个需求。没有的话,上屏幕就是浪费钱和开发周期。
二、有屏方案:QT5 / QT6 框架选型
2.1 QT5 vs QT6 对比
| 对比项 | QT5 | QT6 |
|---|---|---|
| 成熟度 | 非常成熟,工控领域大量验证 | 仍在迭代,部分模块不完善 |
| 架构 | qmake构建,C++11 | CMake构建,C++17 |
| 图形后端 | LinuxFB、EGLFS、Wayland | 主推Wayland,LinuxFB支持退化 |
| QML | Qt Quick 2.x | Qt Quick 3D增强 |
| 模块变化 | 全模块 | 部分模块移除/合并 |
| 交叉编译 | 文档丰富,踩坑少 | 遇到坑可能查不到 |
| 授权 | LGPL/commercial | LGPL/commercial |
工控选型建议:2025年之前的新项目仍然优先选 QT5。理由很简单:文档全、社区活跃、踩过的坑有人填过了。QT6 除非你需要 Qt Quick 3D 或者新渲染管线,否则现在上车反而增加风险。
2.2 QT 版本推荐
QT 5.15.x —— LTS长期支持版,工控首选,稳定到2025年 QT 6.5.x —— 如果一定要上QT6,从6.5开始比较成熟三、QT 轻量化裁剪
QT 默认编译出来很大,工控设备 Flash 有限,必须裁。裁剪的原则是:只留你用的模块,其余全砍掉。
3.1 编译选项裁剪
./configure\-prefix/opt/qt5\-opensource-confirm-license\-release\# 发布版,不开debug-strip\# 去调试符号-optimized-qmake\-no-debug-and-release\# 只编release\-no-feature-xml\# 不用XML-no-feature-dom\# 不用DOM-no-feature-sql\# 不用SQL(如果用sqlite单独开)-no-feature-testlib\# 不要测试框架-no-feature-concurrent\# 不用QtConcurrent-no-feature-threads\# 视情况,如果用多线程则保留\-no-opengl\# 没GPU就不开OpenGL-no-eglfs\# 或保留EGLFS(取决于显示后端)-no-xcb\# 不用X11-no-linuxfb\# 如果走EGLFS可以关-no-kms\# 不用DRM/KMS\-no-feature-printdialog\# 打印相关全关-no-feature-printer\-no-feature-pdf\\-skipqtwebengine\# WebEngine巨大,必砍-skipqtwebchannel\-skipqtwebsockets\# 不用WebSocket就砍-skipqtlocation\-skipqtmultimedia\# 没音视频需求-skipqtquick3d\# 不用3D-skipqtquickcontrols2\# 如果自己写控件-skipqttools\# 如果不需要Designer-skipqtscript\-skipqtsensors裁剪前 QT5 完整编译约 800MB,裁剪后可以压到 50-100MB,工控 Flash 完全扛得住。
3.2 QML 模块裁剪
如果用 QML 开发界面,不用到的 Qt Quick 模块也可以去掉:
# configure 中-no-feature-qt-quick-particles# 粒子效果-no-feature-qt-quick-animatedimage# 动画图片四、QT 工控界面设计原则
工控界面不是手机 APP,用户带着手套、环境粉尘大、光线强,这些都要考虑:
| 设计原则 | 说明 |
|---|---|
| 大按钮 | 最小 60x60 像素,戴手套可触控 |
| 高对比度 | 白底黑字或黑底黄字,户外可读 |
| 防误触 | 关键操作加确认弹窗 |
| 状态可视化 | 设备状态用颜色区分(绿=正常,红=报警) |
| 实时刷新 | 数据每秒更新,但避免UI卡顿 |
| 禁止花哨动画 | 工控不需要,浪费CPU和GPU |
| 字体够大 | 最小 16px,标题 24px+ |
五、QT 显示后端选择
工控板通常没有 X11 桌面环境,QT 需要直接输出到屏幕。有几种后端可选:
| 后端 | 说明 | 适用场景 |
|---|---|---|
| EGLFS | 直接通过OpenGL ES渲染到屏幕 | 有GPU的板子,性能最好 |
| LinuxFB | 通过framebuffer直接绘制 | 无GPU,性能一般但够用 |
| Wayland | 通过Wayland compositor | 需要窗口管理 |
| XCB | 通过X11 | 工控极少用 |
5.1 EGLFS 配置
# 运行QT程序时指定平台./myapp-platformeglfs# 环境变量指定显示设备exportQT_QPA_EGLFS_PHYSICAL_WIDTH=154exportQT_QPA_EGLFS_PHYSICAL_HEIGHT=86exportQT_QPA_EGLFS_FB=/dev/fb05.2 LinuxFB 配置
# 没有GPU时用framebuffer./myapp-platformlinuxfb:fb=/dev/fb0# 设置分辨率和颜色深度exportQT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=800x480:depth=165.3 触摸屏输入
# 指定触摸设备节点( tslib 或 evdev)exportTSLIB_TSDEVICE=/dev/input/event0exportQT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event0# 或使用 tslib 校准后exportQT_QPA_PLATFORM=linuxfb:fb=/dev/fb0exportQT_QPA_GENERIC_PLUGINS=tslib六、无屏纯后台方案
没有屏幕的设备,程序就是一个守护进程,干活方式:串口采集数据 → 本地处理 → 网络上报。
6.1 systemd 服务化
# /etc/systemd/system/data-gateway.service [Unit] Description=Industrial Data Gateway After=network.target [Service] Type=simple ExecStart=/usr/bin/data_gateway Restart=always RestartSec=5 StandardOutput=syslog # 日志走syslog StandardError=syslog SyslogIdentifier=data-gateway [Install] WantedBy=multi-user.targetsystemctlenable>6.2 C 语言采集 + MQTT 上报架构#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#include<time.h>#include<MQTTClient.h>#defineSENSOR_DEV"/dev/ttyS1"/* 串口设备 */#defineMQTT_BROKER"tcp://192.168.1.100:1883"#defineMQTT_TOPIC"factory/device01/data"#defineINTERVAL5/* 采集间隔(秒) *//* 读取传感器数据(简化示例) */staticintread_sensor(intfd,float*temp,float*humi){/* 实际中通过Modbus RTU或自定义协议读取 *//* 这里用模拟数据示意 */*temp=25.6+(rand()%100)/10.0;*humi=60.0+(rand()%100)/10.0;return0;}intmain(intargc,char*argv[]){MQTTClient client;MQTTClient_connectOptions opts=MQTTClient_connectOptions_initializer;/* 初始化 MQTT 客户端 */MQTTClient_create(&client,MQTT_BROKER,"device01",MQTTCLIENT_PERSISTENCE_NONE,NULL);opts.keepAliveInterval=30;opts.cleansession=1;if(MQTTClient_connect(client,&opts)!=MQTTCLIENT_SUCCESS){fprintf(stderr,"Failed to connect to MQTT broker\n");return-1;}/* 主循环:采集 → 上报 */while(1){floattemp,humi;charpayload[256];time_tnow=time(NULL);read_sensor(0,&temp,&humi);/* 组装 JSON */snprintf(payload,sizeof(payload),"{\"timestamp\":%ld,\"temperature\":%.1f,\"humidity\":%.1f}",now,temp,humi);/* 发布到 MQTT */MQTTClient_message msg=MQTTClient_message_initializer;msg.payload=payload;msg.payloadlen=strlen(payload);msg.qos=1;MQTTClient_publishMessage(client,MQTT_TOPIC,&msg,NULL);printf("[%ld] Published: %s\n",now,payload);sleep(INTERVAL);}MQTTClient_disconnect(client,10000);MQTTClient_destroy(&client);return0;}
6.3 编译
CC = arm-linux-gnueabihf-gcc CFLAGS = -I/path/to/paho-mqtt/include LDFLAGS = -L/path/to/paho-mqtt/lib -lpaho-mqtt3c -lpthread data_gateway: main.c $(CC) $(CFLAGS) -o $@ main.c $(LDFLAGS) $(STRIP) $@
七、两种模式架构对比
对比维度 有屏 UI 模式 无屏纯后台模式 硬件成本 高(屏+触摸+GPU) 低(只需串口+网络) 开发语言 C++ / QML C / Python 开发周期 2-4 个月 2-4 周 调试复杂度 高(UI调试+设备调试) 低(日志为主) 运行内存 128MB+ 32MB 足够 Flash 占用 100MB+(QT库+资源) 10MB 现场操作 直接触屏操作 远程网络操作 适用规模 单机控制柜 分布式采集节点
八、QT 工控界面示例
一个简单的状态监控面板,展示温度、湿度和设备状态:
#include<QApplication>#include<QWidget>#include<QLabel>#include<QVBoxLayout>#include<QTimer>#include<QFile>#include<QTextStream>classMonitorPanel:publicQWidget{Q_OBJECTpublic:MonitorPanel(QWidget*parent=nullptr):QWidget(parent){/* 全屏显示 */setWindowState(Qt::WindowFullScreen);/* 状态标签 */QLabel*titleLabel=newQLabel("工控设备监控面板",this);titleLabel->setStyleSheet("font-size: 28px; font-weight: bold; color: white; ""background-color: #2c3e50; padding: 10px;");/* 数据标签 */tempLabel=newQLabel("温度: -- °C",this);humiLabel=newQLabel("湿度: -- %RH",this);statusLabel=newQLabel("状态: 正常",this);QString dataStyle="font-size: 24px; color: #2c3e50; padding: 15px;";tempLabel->setStyleSheet(dataStyle);humiLabel->setStyleSheet(dataStyle);statusLabel->setStyleSheet("font-size: 24px; color: green; padding: 15px; font-weight: bold;");/* 布局 */QVBoxLayout*layout=newQVBoxLayout(this);layout->addWidget(titleLabel);layout->addWidget(tempLabel);layout->addWidget(humiLabel);layout->addWidget(statusLabel);layout->addStretch();/* 定时刷新 */QTimer*timer=newQTimer(this);connect(timer,&QTimer::timeout,this,&MonitorPanel::updateData);timer->start(1000);/* 初始样式 */setStyleSheet("background-color: #ecf0f1;");}privateslots:voidupdateData(){/* 读取传感器数据(实际中通过串口或Modbus) */QFilef("/sys/class/hwmon/hwmon0/temp1_input");if(f.open(QIODevice::ReadOnly|QIODevice::Text)){inttemp=f.readAll().trimmed().toInt()/1000;tempLabel->setText(QString("温度: %1 °C").arg(temp));/* 温度报警 */if(temp>60){statusLabel->setText("状态: 温度报警!");statusLabel->setStyleSheet("font-size: 24px; color: red; padding: 15px; font-weight: bold;");}}}private:QLabel*tempLabel;QLabel*humiLabel;QLabel*statusLabel;};intmain(intargc,char*argv[]){QApplicationapp(argc,argv);MonitorPanel panel;panel.show();returnapp.exec();}#include"main.moc"
九、方案选择建议
9.1 选有屏 UI 的条件
- 现场有人操作,需要人机交互
- 需要展示实时图表、趋势曲线
- 设备在控制柜面板上,操作员直接操作
- 项目预算允许增加屏幕硬件成本
9.2 选无屏后台的条件
- 设备安装在机柜深处或室外,无人值守
- 数据采集后通过 MQTT/Modbus TCP 上报
- 需要多台设备组网,每台都是采集节点
- 成本敏感,Flash 和 RAM 预算有限
9.3 混合方案
有些项目可以两者结合:网关有屏(QT),子节点无屏(C程序)。网关汇聚所有子节点数据并展示,子节点只负责采集和上报。这种架构在智慧农业、工厂 MES 系统中很常见。
十、方案对比总结
┌──────────────┬──────────────┬──────────────┐ │ │ 有屏 UI │ 无屏后台 │ ├──────────────┼──────────────┼──────────────┤ │ 框架 │ QT5/QT6 │ 纯C/Python │ │ 显示后端 │ EGLFS/FB │ 无 │ │ 网络 │ 可选 │ 必须 │ │ 开发周期 │ 长 │ 短 │ │ BOM成本 │ 高 │ 低 │ │ 适合场景 │ HMI面板 │ 采集网关 │ └──────────────┴──────────────┴──────────────┘
选方案这件事,核心就一句话:看用户要不要碰设备。要碰就上屏幕加 QT,不碰就纯后台加网络。搞清楚了再动手,免得返工。
编程学习
技术分享
实战经验