ARTICLE · 1168223
QT自定义控件之乙烯裂解工艺监控系统(源码开源)
QT自定义控件之乙烯裂解工艺监控系统(源码开源)一、前言 最近好长时间没有更新了,过了一个假期,所以忙东忙西也没时间来更新新的作品。现在AI这么强了,但是还在坚持创作。很荣幸也得到了一些同道中人的支持,在这里感谢大家!这期依然是在垂直领域里的创新,大家如果有什么需求灵感也可以评论区里讨论,博主也会努力坚持更新! 好了,继续晒出技术栈:C++\QT\QPainter。 二、作品展示 用 QPainter 打造轻量化工业 SCADA 画面引擎,支持工艺图渲染、实时数据绑定、动态流体动画、阀门状态切换、测点告警,适配工控机稳定运行。 画面完整还原乙烯裂解装置工艺流程:立式塔器、缓冲罐、离心泵、调节阀、管道管网,搭配实时数据面板、状态指示灯、流体流动动画,深蓝色工业科技风,符合化工中控室 HMI 视觉规范。管线用 下面来展示下这期的作品: 


开发的核心亮点: ✨亮点 3:轻量交互控制 主窗口提供开始、停止按钮,一键切换全站运行状态,联动刷新所有开关、管道、警告的显示效果。下面来展示开始停止的功能: 

三、实现流程 2、核心代码 本期的核心代码主要在 四、源码开源 本期源码开放,有需要的朋友可评论区回复“需要源码”,如果觉得这个对你有帮助麻烦大家关注点赞收藏~博客更新的动力,感谢大家~如果有定制化需要,也可直接私信~视频后期会放在这里或某站,同名“Q态王”可搜索。大家如果有什么新的控件灵感,也可以评论区交流 五、往期精选文章推荐 1、QT自定义控件之电气接线图(源码开源) 2、QT自定义控件之葫芦兄弟(致敬童年动画片) 3、QT自定义控件之暖通系统(作品展示) 4、QT自定义控件之智慧农田操作系统(作品展示) 5、QT自定义控件之多发酵罐并联工艺(源码开源) 6、QT自定义控件之热换站系统(源码开源) 7、QT自定义控件之压缩机监控系统(源码开源) 8、QT自定义控件之化工配置流程示意(源码开源) 9、QT自定义控件之双向运行地铁(源码开源) 10、QT自定义控件之储能电站(源码开源)
QPen绘制,支持不同粗细、颜色区分介质:绿色 / 黄色 / 红色管线代表不同物料介质。


✨亮点 1:管道流体流动动画,轻量定时器驱动
工业组态最直观的效果就是管线内介质流动箭头。 方案:使用QTimer低频率刷新(工控场景不需要高刷,降低 CPU 占用),维护管线路径上一组采样点,每次刷新偏移箭头坐标。
不同介质管线独立控制流速,可根据后端实时流量数据动态调整箭头移动速度; 管线支持分段,流向可双向切换;利用 QPainterPath保存管线贝塞尔曲线路径,沿着路径做点采样,定时器不断偏移采样点,绘制三角形箭头模拟介质流动。做了性能优化:只有处于可视区域的管线才执行动画绘制,闲置管线暂停刷新,避免大量管线同时动画造成 CPU 飙升
✨亮点 2:深色工业 UI 风格,适配中控室使用场景
中控室环境光线偏暗,所以整体采用深蓝暗色主题,降低屏幕眩光。
配色体系:深色画布,高对比度管线;设备金属渐变,实现数据面板的发光边框; 文字选用等宽工业字体,保证数字读数稳定对齐,防止数值跳动时界面抖动。


1、主窗口结构
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow){ui->setupUi(this);m_Timer = new QTimer(this);connect(m_Timer,SIGNAL(timeout()),this,SLOT(SlotTimer()));m_CurrentFlag = false;}
CustomWidget.cpp中部分代码展示:#if defined(_MSC_VER) && (_MSC_VER >= 1600)# pragma execution_character_set("utf-8")#endifvoidrotateAndPaintRect(QPainter *painter, const QRectF &rect, int angle,bool isRound = false,int rx = 0,int ry = 0){qreal cx = 0;qreal cy = 0;cx = rect.center().x();cy = rect.center().y();painter->save();painter->translate(cx ,cy);painter->rotate(angle);QPointF drawOffset = rect.topLeft() - QPointF(cx,cy);painter->drawRect(drawOffset.x(), drawOffset.y(), rect.width(), rect.height());painter->restore();}voidDrawText(QPainter &painter,const QRectF &rect,QString str,double angle,int size,QString fontFamily,int textAlignment){QRectF rotatedRect(-rect.width()/2, -rect.height()/2, rect.width(), rect.height());qreal cx = rect.x() + rect.width() / 2;qreal cy = rect.y() + rect.height() / 2;QFont font = QFont(fontFamily, size);painter.setFont(font);painter.save();painter.translate(cx, cy);painter.scale(1, -1);painter.rotate(-angle);//旋转角度painter.drawText(rotatedRect,textAlignment,str);//恢复上面保存的状态painter.restore();}voidDrawImage(QPainter &painter, QImage &image, const QRectF &rect,double angle){QRectF rotatedRect(-rect.width()/2, -rect.height()/2, rect.width(), rect.height());painter.drawImage(rotatedRect, image);}















































































