Qt实现绘制多个设备的流量曲线图详解

目录
  • 一、说明
  • 二、界面模型
  • 三、功能分析
  • 四、界面效果
  • 五、主要代码

一、说明

在实际项目中,主要是使用Qt开发CS程序,当然主要是客户端。公司项目中有这个需求是实时显示多个设备的流量曲线图,设备将流量信息发给服务端,服务端再将信息通过Socket发给Qt客户端,Qt客户端通过Socket接收后实时显示在程序的一个窗口上;这个显示是以曲线图的展示方式。

二、界面模型

接到这个功能需求后,使用的界面模型如下图所示,图示已经标示的很清楚了,我就不多详细描述了:

三、功能分析

1、由于设备较多,超过100台,所以不可能每个设备的流量曲线都用一种颜色,因此只选择几种比较明显的颜色作为设备的流量曲线颜色,每次上来一个设备,就用其中的一种颜色绘制曲线。

2、使用QSS来设置部件的样式信息,如前景、背景、被选择时、鼠标移动时等等。

3、用一个部件用作专门的绘制部件,该部件放在窗口中,因此安装事件过滤器,用于重绘子部件信息,绘制曲线图。

4、处理设备上线/下线的网络消息以及设备主动发送的动态流量信息;处理Qt客户端与服务端的连接/断开事件。

四、界面效果

开发出来的最终效果图如下所示:

初始所有设备的流量图如下图

选择设备名为a5的流量图,其中a5设备的流量曲线加粗,背景半透明等效果如下图

选择设备名为a7的流量图,其中a7设备的流量曲线加粗,背景半透明等效果如下图

五、主要代码

//消息过滤,主要用于重绘子控件,过滤Paint事件
 bool QAPRTCurWidget::eventFilter(QObject *watched, QEvent *event)
 {
     if(watched==ui->widget_rxtx && event->type()==QEvent::Paint)
     {
         updateWidgetRTX();
     }
     return QFrame::eventFilter(watched,event);
 }
//绘图操作
 void QAPRTCurWidget::updateWidgetRTX()
 {
     QPainter painter(ui->widget_rxtx);
     painter.setFont(QFont("Times", , QFont::Bold));
     //绘制背景颜色
     painterBackground(painter);
     //画最左边一条虚线,用于和List隔开
     painterLeftDashLine(painter);
     //画纵坐标文本标识
     updateVTextID(painter);
     //画纵坐标文本刻度以及横纵坐标轴
     updateVTextMarkAndCoord(painter);
     //画RX曲线
     paintRXLineInfo(painter);
     //画TX曲线
     paintTXLineInfo(painter);
 }
//画纵坐标文本刻度以及横纵坐标轴
 void QAPRTCurWidget::updateVTextMarkAndCoord(QPainter &painter)
 {
     painter.save();
     //绘图区间的实际高度(部件高度-顶部间隔-底部间隔)
     int nActPaintHeight = ui->widget_rxtx->height()-INTERVAL_WIDGET_TOP-INTERVAL_WIDGET_BOTTOM;
     //每隔的间隔高度
     float fIntervalHeight = ((float)nActPaintHeight)/(m_nVSingleLinePointCount-);
     float fYPointForZero = ui->widget_rxtx->height()-INTERVAL_WIDGET_BOTTOM;
     double dDivideValue = ;
     if(ui->toolButton_rxflow->isChecked())
     {
         dDivideValue = ((double)nRXMaxValue)/(m_nVSingleLinePointCount-);
     }
     if(ui->toolButton_txflow->isChecked())
     {
         dDivideValue = ((double)nTXMaxValue)/(m_nVSingleLinePointCount-);
     }
     for(int nIndex=;nIndex<m_nVSingleLinePointCount;++nIndex)
     {
         //设置文本颜色
         painter.setPen(TEXTCOLOR_WIDGET_PAINT);
         //将原来的字体变小,设置为8
         QFont objFont = painter.font();
         objFont.setPointSize();
         painter.setFont(objFont);
         //画文本,加3的目的是为了是其和横线能保持中间持平
         painter.drawText(INTERVAL_VMARK_LEFT,fYPointForZero-nIndex*fIntervalHeight+,QCommonOP::getKMStrForBit(dDivideValue*nIndex));
         //设置横线颜色
         painter.setPen(COORDCOLOR_WIDGET_PAINT);
         //画横线(第一条和最后一条为实线,中间的为虚线)
         QPen objPen = painter.pen();
         if(==nIndex || (m_nVSingleLinePointCount-)==nIndex)
         {
            objPen.setStyle(Qt::SolidLine);
         }
         else
         {
             objPen.setStyle(Qt::DashLine);
         }
         painter.setPen(objPen);
         float x1 = ui->widget_rxtx->width()-INTERVAL_WIDGET_RIGHT;
         float y1 = fYPointForZero-nIndex*fIntervalHeight;
         painter.drawLine(INTERVAL_HCOORD_LEFT,fYPointForZero-nIndex*fIntervalHeight,x1,y1);
     }
     int nActPaintWidth = ui->widget_rxtx->width()-INTERVAL_HCOORD_LEFT-INTERVAL_WIDGET_RIGHT;
     //每隔的间隔高度--横向:注意使用(float)nActPaintWidth)作为分子,即浮点数
     float fIntervalWidth = ((float)nActPaintWidth)/(m_nHSingleLinePointCount-);
     for(int nIndex=;nIndex<m_nHSingleLinePointCount;++nIndex)
     {
         QPen objPen = painter.pen();
         if(==nIndex || (m_nHSingleLinePointCount-)==nIndex)
         {
            objPen.setStyle(Qt::SolidLine);
         }
         else
         {
             objPen.setStyle(Qt::DashLine);
         }
         painter.setPen(objPen);
         int nXPoint = INTERVAL_HCOORD_LEFT+nIndex*fIntervalWidth;
         painter.drawLine(nXPoint,INTERVAL_WIDGET_TOP,nXPoint,ui->widget_rxtx->height()-INTERVAL_WIDGET_BOTTOM);
     }
     painter.restore();
 }

到此这篇关于Qt实现绘制多个设备的流量曲线图详解的文章就介绍到这了,更多相关Qt绘制流量曲线图内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Qt图形图像开发曲线图表模块QChart库缩放/平移详细方法与实例

    1.使用QChartView来缩放 (1)用鼠标框选一个矩形,把图放大到这个矩形 QChartView::setRubberBand(QChartView::RectangleRubberBand);//XY方向同时放大到鼠标画出的矩形大小(也可以设置为只放大X轴或Y轴) (2)setRubberBand函数同时也能使鼠标右键,具备缩小图的功能. 2.使用Qchart来平移和缩放 QChart::scroll(-10, 5);//整体平移(-10, 5),两个参数分别为Δx和Δy QChart:

  • Qt图形图像开发之曲线图表模块QChart库一个chart中显示两条曲线详细方法与实例

    首先要了解QChartView.QChart.QLineSeries.QValueAxis的实体之间的关系,例如一个QChartView中可以包含几个QValueAxis?这些可参考 Qt图形图像开发曲线图表模块QChart库基本用法.各个类之间的关系说明 每个chart可以包含多个QLineSeries数据系列,每个QLineSeries数据系列又包含了2个QValueAxis数值轴或QDateTimeAxis时间轴. 那么这个chart中的多个数据系列,一起显示在同一个chart中,会是什么

  • Qt图形图像开发曲线图表模块QChart库基本用法、各个类之间的关系说明

    如何编译安装QChart请查看下面文章 Qt图形图像开发之曲线图表库QtChart编译安装详细方法与使用实例 使用Qt曲线图表模块Chart库首先要注意3点: (1)在.pro文件中添加:QT += charts. (2)用到QChart的文件中添加:QT_CHARTS_USE_NAMESPACE,或者:using namespace QtCharts; 在ui界面中拖入一个graphicsView控件,然后右击提升为QChartView类,写提升为的类:QtCharts::QChartView

  • PyQt5+QtChart实现绘制曲线图

    目录 QSplineSeries 实现代码 效果图 QSplineSeries QSplineSeries类将数据序列显示为曲线图.核心代码: spline = QSplineSeries()spline.append(0, 23)spline.append(1, 56)…chart.addSeries(lineSeries) 常用方法 setPointsVisible(True) :设置数据点显示状态 setPointLabelsVisible(True):设置数据点标签显示状态 setPoi

  • QT委托代理机制之Model View Delegate使用方法详解

    目录 本地数据加载(Data) 添加数据模型(Model) 添加代理模型(Proxy) 添加元素的代理(Delegate) 添加视图层(View) 使用效果 之前的一篇文章中介绍过QT的委托代理机制,那时候由于理解的比较浅就简单的给了一个例子.最近又做了一部分相关的工作,发现之前的理解有点问题.这里就详细的介绍一下QT的委托代理机制的用法,希望对大家有帮助. Model-View-Delegate机制可以简单的理解为将本地的一些数据以特定的UI形式呈现出来.常见的数据结构包括列表数据(list)

  • Python绘制二维曲线的日常应用详解

    使用Python绘制出类似Excel或者MATLAB的曲线还是比较容易就能够实现的,需要用到的额外库有两个,numpy和matplotlib.使用这两个模块实现的曲线绘制其实在一定程度上更像是MATLAB的plot功能,不过今天看了一下matplotlib网站上的信息,现在的功能更为强劲了,而且已经支持三维图像的绘制. 模块库的安装非常简单,我使用的Mac,在Mac上用pip进行了两个模块库的安装都十分顺畅.相信其他平台基本上也都这样,如果能够联网,这种安装方式是十分推荐的,确实是简单. 我用P

  • Python tkinter库绘制春联和福字的示例详解

    马上要过年了,用 Python 写一副春联&福字送给大家,本文我们主要用到的 Python 库为 tkinter,下面一起来看一下具体实现. 首先,我们创建一个画布,代码实现如下: root=Tk() root.title('新年快乐') canvas=Canvas(root,width=500,height=460,bg='lightsalmon') 看一下效果: 我们接着写上联,主要代码实现如下: for i in range(0,451): canvas.create_rectangle(

  • Python使用pyecharts绘制世界地图,省级地图,城市地图实例详解

    目录 1.世界地图绘制演示 ① 世界地图数据准备 ② 世界地图生成 2.省份(河北省)地图绘制演示 ① 省份地图数据准备 ② 省份地图生成 3.城市(承德市)地图绘制演示 ① 城市地图数据准备 ② 城市地图生成 1.世界地图绘制演示 先给大家看下效果图哈. ① 世界地图数据准备 地图数据如下: 因为是世界地图,所以对标的国家,我设置了 2 组,里面的数据是随机生成的. # -*- coding:utf-8 -*- # 2022-2-14 # 作者:小蓝枣 # pyecharts地图 # 需要引用

  • 基于Matlab绘制超绚丽的烟花的过程详解

    目录 1.使用效果 2.随机点生成 3.图像膨胀 4.特效「风」模拟 5.级坐标变换 6.图像模糊及再映射 7.图像上色 8.完整代码 1.使用效果 2.随机点生成 我们要构造一个黑色背景,对其添加高斯噪声,然后依据阈值删掉部分噪声,生成一张随机点图片: % 构造黑色背景并生成白色杂点 blackPic=uint8(zeros(800,800)); distPic=imnoise(blackPic,'gaussian',0, 0.11); distPic(distPic<254)=0; 3.图像

  • Matlab绘制散点密度图的教程详解

    目录 效果 1工具函数完整代码 2参数说明 3使用方式 3.1散点赋色 3.2等高线图 3.3带直方图的散点图 3.4带直方图的等高线图 4使用方式扩展–与ggplot修饰器联动 效果 原理也很简单,通过matlab自带的ksdensity获得网格每一点密度,通过密度拟合曲面,再计算每个数据点对应的概率,并将概率映射到颜色即可为了怕大家找不到函数这次工具函数放到最前面 1工具函数完整代码 function [CData,h,XMesh,YMesh,ZMesh,colorList]=density

  • Matlab绘制酷炫坐标区域的方法详解

    目录 使用方式 其他炫酷的背景 注意事项 代码展示及mat文件获取 写了一个能让坐标区域变得很炫酷的修饰函数: 同时想到了一个很有意思的把函数存储进mat文件的方法,方法就不细讲了,大家自行点开.mat文件能够很轻松的理解原理(大概), 使用方式 首先说明一下函数咋用:假设编写了如下函数: t=0:0.35:3*pi; plot(t,sin(t),'Marker','d','LineWidth',2,'Color',[102,194,166]./255) hold on plot(t,cos(t

  • R语言利用ggplot2绘制QQ图和箱线图详解

    目录 绘制qq图 函数介绍 例子 绘制boxplot 函数介绍 例子 利用分位点绘制箱线图 将QQ图和箱线图进行融合 函数介绍 参数介绍 注意事项 例子 绘制qq图 在ggplot2中绘制qq图需要两步,geom_qq()将绘制样本分位点,geom_qq_line()将绘制标准正态线 函数介绍 geom_qq() geom_qq( mapping = NULL, data = NULL, geom = "point", position = "identity",

  • Qt控件点击消息获取的方法详解

    目录 1.QPushButton响应鼠标点击消息 1.1自身响应消息clicked 1.2事件过滤器响应消息 1.3mousePressEvent事件获取 2.QLabel响应鼠标点击消息 2.1事件过滤器响应消息 2.2mousePressEvent事件获取 今日为大家分享一个小功能实现:如何获取控件点击响应. 在这里,我以两个最简单并且具有代表性的控件来进行功能讲解. 举例控件:QLabel.QPushButton 对于这两个控件大家应该都不会陌生了,做界面开发经常会用到的. 开发环境:VS

  • 排查服务器异常流量教程详解

    目录 引言 磁盘使用率报警 原因分析 解决方案 1. 日志迁移或清理 2. 日志清理 网站流量异常,一直在报警 通过分析日志排查异常流量 首先切换到日志目录,比如我的目录是 查看访问最频繁的前10个IP 分析结果: 解决异常流量 公网ip访问量最大: 封禁恶意ip 停掉不用的服务 统计访问最多的url 前10名 封禁了不再使用url 优化结果 总结 引言 这篇文章将介绍当WEB服务器报警,提示磁盘使用率问题和带宽满载时的一些排查思路和解决方案. 首先,我们一定要配置服务器的云监控,如果是云厂商的

随机推荐