QT自定义控件之热换站系统(源码开源)

一、前言

这期算是一次在之前基础上的升级一篇,之前也做过一次热换站系统,不过当时是纯纯手搓版本,老版的视频在某站上有发,如果大家感兴趣,可以去查看。

然后这期依然选择使用 C++ + Qt + QPainter 绘制的方式完成整套热换站远程监控组态界面。结合定时器驱动动画,实现管道介质流动、泵运行状态指示灯、阀门开度、实时数据渲染,完整复刻工业 SCADA 组态监控画面。本文就来拆解这套组态界面的开发思路与实现流程。

二、作品展示

本次实现的是热换站远程监控系统组态画面,完整还原换热站工艺流程:一次网供水回水、板式换热器、循环泵组、补水泵、水箱、各类阀门、压力表传感器,搭配左侧设备状态表格、阀门统计面板、能耗统计面板,右侧实时测点数据面板。先来展示下效果:

项目创意点:

  • 背景图炫酷效果

  • 管道流体流动动画效果

  • 工业风 UI 面板绘制

  • 数据驱动绘图,业务解耦

1、背景图炫酷效果

本项目的背景视觉不是单纯靠代码填色实现,而是先设计一张深色科技风背景图,再作为整体底层资源融入 Qt 组态画面。背景图采用深蓝黑主色调,加入渐变光晕、微弱网格、流光线条、局部蓝色辉光等元素,让整个监控系统一打开就具备工业大屏的科技感。

在 Qt 中,背景图作为最底层绘制资源,管道、设备、数据面板都叠加在其上。这样做的好处是:

  • 背景效果更丰富,可以实现复杂渐变、光效、纹理和空间感;

  • 后期换主题时,只需要替换一张背景图,不需要修改业务逻辑;

  • 更接近真实工业监控系统的大屏视觉效果。

但要注意,背景图不宜做得太花,否则会影响上方管道、文字和数据面板的可读性。因此背景整体保持低亮度、低对比,蓝色发光元素集中在边缘和装饰区域,中间工艺流程区域保持干净。

2、管道流体流动动画效果

用 QPainter 实现动态工艺流程,组态画面的核心不只是 "画出来",而是要 "动起来"。本项目通过 QTimer 定时刷新画面,结合 QPainter 分层绘制,实现管道内流体流动效果。

不同介质可以用不同颜色区分(颜色可根据个人喜好来更改):

  • 一次网供水:红色或橙红色;

  • 二次网循环水:绿色或蓝绿色;

  • 回水管道:使用低饱和深色;

  • 异常管道:可切换为红色告警色。

3、工业风 UI 面板绘制

项目中的信息面板没有完全依赖 Qt 原生控件,而是使用 QPainter结合背景图来进行手绘实现。

工业风 UI 面板主要包含以下元素:

  • 半透明深色面板底;

  • 蓝色发光边框;

  • 表头高亮条;

  • 数据表格分割线;

  • 设备状态文字;

  • 正常、异常、运行、停止等状态标识。

4、数据驱动绘图,业务解耦

这一点是项目实现工业组态的关键。这个控件通过QWidget来进行提升使用,后期业务整合的时候,可直接增加业务。同时这部分渲染没有把业务逻辑和绘图逻辑混在一起。

三、实现流程

1、主窗口MainWindow

复制代码
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    timer = new QTimer(this);  // 创建定时器对象

    static int count = 0;
    static bool flag = 0;
    static int colorflag = 0;
            connect(timer,&QTimer::timeout,
                       [=]()
               {



                  double randomNumber = QRandomGenerator::global()->generateDouble() * 100; // 生成一个0到99之间的随机数(包括0和99)

                  ui->widget->Set_TextChangeEvent(count,QString::number(randomNumber,'f',2));
                  count++;
                  if(count>9)
                  {
                      count = 0;
                  }

                    int randomState = QRandomGenerator::global()->bounded(2);
                    int randomStateID = QRandomGenerator::global()->bounded(6);
                  //状态控制
                  ui->widget->Set_TextChangeEvent(stateID[randomStateID],state[randomState]);

                  //水箱控制
                  ui->widget->Set_TextChangeEvent(17,QString::number(randomNumber,'f',2));

                  //指示灯控制
                  int randomLedID = QRandomGenerator::global()->bounded(12);
                  static bool ledState = true;
                  ui->widget->Set_DisplayEvent_IsShow(ledID[randomLedID],ledState = !ledState);

               }
               );

}

2、核心代码主要在CustomWidget.cpp中

复制代码
//绘制流动线段
void drawFlowLine(QPainter *painter, QPolygonF points,QColor backgroundColor,
                                    int bgLineWidth,QColor lineColor,int lineWidth,const FlowInfo &flowInfo)
{
QPen pen(backgroundColor);
pen.setJoinStyle(Qt::RoundJoin);
pen.setStyle(Qt::SolidLine);
pen.setWidth(bgLineWidth);
pen.setCapStyle(Qt::RoundCap);
painter->setPen(pen);
painter->drawPolyline(points);
QPen pen1(lineColor);
QVector<qreal> dashes;
qreal space = 2;
dashes << 3 << space << 3 << space;
pen1.setDashPattern(dashes);
pen1.setWidth(lineWidth);
pen1.setJoinStyle(Qt::RoundJoin);
pen1.setCapStyle(Qt::RoundCap);
pen1.setDashOffset(flowInfo.offset);
painter->setPen(pen1);
painter->drawPolyline(points);
}

四、源码开放

大家需要源码去下面位置找我~

QT自定义控件之热换站系统(源码开源)

相关推荐
qq7621182211 小时前
Ubuntu22.04 Qt 调用shell 脚本启动程序,GLFW 初始化失败
qt
李少兄12 小时前
Java 中只有值传递吗?
java·开发语言·python
可乐鸡翅yeah_12 小时前
hls.js 播放质量埋点实战,采集卡顿、起播、错误指标定位线上用户问题
开发语言·前端·javascript·ecmascript·音视频·m3u8·音视频在线播放
szarron12 小时前
RF Demo Kit|NanoVNA 射频演示测试板完整上手教程,滤波器、衰减器、SOLT 校准学习板
开发语言·人工智能·学习·php·射频工程·频谱仪
边境悍匪12 小时前
蜗牛学苑 Java 智能体学习 Day39|SpringAI 会话存储、Function‑Call 工具调用、MCP 思维导图复盘
java·开发语言·spring boot·学习·阿里云
万物智能信息科技13 小时前
RK3568 的多路显示移植—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
linux·开发语言·华为·开源·harmonyos
蓝悦无人机13 小时前
Qt Design Studio(QDS)4.8.2项目文件结构详解
开发语言·qt·qt creator·qds·项目文件结构·qtc
yxlalm13 小时前
4.java秒杀项目第四课-后端商品后台接口
java·开发语言
孙启超13 小时前
【AI开发之Rust】第 1 课:认识 Rust 与开发环境 —— 装好工具链,跑通第一个程序
开发语言·人工智能·后端·ai·rust·安全架构
君顾114 小时前
家政派单小程序源码开发实战:从零搭建到上线全流程指南
java·开发语言·家政派单