工控界面方案选型:QT5/QT6 轻量化窗口、无屏纯后台两种开发模式
工控界面方案选型QT5/QT6 轻量化窗口、无屏纯后台两种开发模式有些工控设备需要人机界面HMI有些就是闷头干活不带屏幕。选哪种方案今天把两条路都铺开让你少走弯路。一、工控设备两大模式工控设备的形态决定界面方案模式典型场景硬件要求开发复杂度有屏 UIHMI工业平板、机床面板、温室控制柜显示屏触摸屏GPU可选中高无屏纯后台数据采集网关、远程I/O模块、环境监测节点无显示屏有串口网络低选方案不是拍脑袋先看项目有没有人要操作设备这个需求。没有的话上屏幕就是浪费钱和开发周期。二、有屏方案QT5 / QT6 框架选型2.1 QT5 vs QT6 对比对比项QT5QT6成熟度非常成熟工控领域大量验证仍在迭代部分模块不完善架构qmake构建C11CMake构建C17图形后端LinuxFB、EGLFS、Wayland主推WaylandLinuxFB支持退化QMLQt Quick 2.xQt Quick 3D增强模块变化全模块部分模块移除/合并交叉编译文档丰富踩坑少遇到坑可能查不到授权LGPL/commercialLGPL/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_WIDTH154exportQT_QPA_EGLFS_PHYSICAL_HEIGHT86exportQT_QPA_EGLFS_FB/dev/fb05.2 LinuxFB 配置# 没有GPU时用framebuffer./myapp-platformlinuxfb:fb/dev/fb0# 设置分辨率和颜色深度exportQT_QPA_PLATFORMlinuxfb:fb/dev/fb0:size800x480:depth165.3 触摸屏输入# 指定触摸设备节点 tslib 或 evdevexportTSLIB_TSDEVICE/dev/input/event0exportQT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS/dev/input/event0# 或使用 tslib 校准后exportQT_QPA_PLATFORMlinuxfb:fb/dev/fb0exportQT_QPA_GENERIC_PLUGINStslib六、无屏纯后台方案没有屏幕的设备程序就是一个守护进程干活方式串口采集数据 → 本地处理 → 网络上报。6.1 systemd 服务化# /etc/systemd/system/data-gateway.service [Unit] DescriptionIndustrial Data Gateway Afternetwork.target [Service] Typesimple ExecStart/usr/bin/data_gateway Restartalways RestartSec5 StandardOutputsyslog # 日志走syslog StandardErrorsyslog SyslogIdentifierdata-gateway [Install] WantedBymulti-user.targetsystemctlenable>6.2 C 语言采集 MQTT 上报架构#includestdio.h#includestdlib.h#includeunistd.h#includestring.h#includetime.h#includeMQTTClient.h#defineSENSOR_DEV/dev/ttyS1/* 串口设备 */#defineMQTT_BROKERtcp://192.168.1.100:1883#defineMQTT_TOPICfactory/device01/data#defineINTERVAL5/* 采集间隔秒 *//* 读取传感器数据简化示例 */staticintread_sensor(intfd,float*temp,float*humi){/* 实际中通过Modbus RTU或自定义协议读取 *//* 这里用模拟数据示意 */*temp25.6(rand()%100)/10.0;*humi60.0(rand()%100)/10.0;return0;}intmain(intargc,char*argv[]){MQTTClient client;MQTTClient_connectOptions optsMQTTClient_connectOptions_initializer;/* 初始化 MQTT 客户端 */MQTTClient_create(client,MQTT_BROKER,device01,MQTTCLIENT_PERSISTENCE_NONE,NULL);opts.keepAliveInterval30;opts.cleansession1;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_tnowtime(NULL);read_sensor(0,temp,humi);/* 组装 JSON */snprintf(payload,sizeof(payload),{\timestamp\:%ld,\temperature\:%.1f,\humidity\:%.1f},now,temp,humi);/* 发布到 MQTT */MQTTClient_message msgMQTTClient_message_initializer;msg.payloadpayload;msg.payloadlenstrlen(payload);msg.qos1;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 / QMLC / Python开发周期2-4 个月2-4 周调试复杂度高UI调试设备调试低日志为主运行内存128MB32MB 足够Flash 占用100MBQT库资源10MB现场操作直接触屏操作远程网络操作适用规模单机控制柜分布式采集节点八、QT 工控界面示例一个简单的状态监控面板展示温度、湿度和设备状态#includeQApplication#includeQWidget#includeQLabel#includeQVBoxLayout#includeQTimer#includeQFile#includeQTextStreamclassMonitorPanel:publicQWidget{Q_OBJECTpublic:MonitorPanel(QWidget*parentnullptr):QWidget(parent){/* 全屏显示 */setWindowState(Qt::WindowFullScreen);/* 状态标签 */QLabel*titleLabelnewQLabel(工控设备监控面板,this);titleLabel-setStyleSheet(font-size: 28px; font-weight: bold; color: white; background-color: #2c3e50; padding: 10px;);/* 数据标签 */tempLabelnewQLabel(温度: -- °C,this);humiLabelnewQLabel(湿度: -- %RH,this);statusLabelnewQLabel(状态: 正常,this);QString dataStylefont-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*layoutnewQVBoxLayout(this);layout-addWidget(titleLabel);layout-addWidget(tempLabel);layout-addWidget(humiLabel);layout-addWidget(statusLabel);layout-addStretch();/* 定时刷新 */QTimer*timernewQTimer(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)){inttempf.readAll().trimmed().toInt()/1000;tempLabel-setText(QString(温度: %1 °C).arg(temp));/* 温度报警 */if(temp60){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();}#includemain.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不碰就纯后台加网络。搞清楚了再动手免得返工。