使用Qt开发绘制多个设备的流量曲线图(附带项目图)

一、说明:

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

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

三、功能分析

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

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

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

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

四、界面效果

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

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

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

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

五、主要代码

1 //消息过滤,主要用于重绘子控件,过滤Paint事件
2 bool QAPRTCurWidget::eventFilter(QObject *watched, QEvent *event)
3 {
4     if(watched==ui->widget_rxtx && event->type()==QEvent::Paint)
5     {
6         updateWidgetRTX();
7     }
8     return QFrame::eventFilter(watched,event);
9 }

 1 //绘图操作
 2 void QAPRTCurWidget::updateWidgetRTX()
 3 {
 4     QPainter painter(ui->widget_rxtx);
 5     painter.setFont(QFont("Times", 12, QFont::Bold));
 6     //绘制背景颜色
 7     painterBackground(painter);
 8     //画最左边一条虚线,用于和List隔开
 9     painterLeftDashLine(painter);
10     //画纵坐标文本标识
11     updateVTextID(painter);
12     //画纵坐标文本刻度以及横纵坐标轴
13     updateVTextMarkAndCoord(painter);
14     //画RX曲线
15     paintRXLineInfo(painter);
16     //画TX曲线
17     paintTXLineInfo(painter);
18 }

 1 //画纵坐标文本刻度以及横纵坐标轴
 2 void QAPRTCurWidget::updateVTextMarkAndCoord(QPainter &painter)
 3 {
 4     painter.save();
 5     //绘图区间的实际高度(部件高度-顶部间隔-底部间隔)
 6     int nActPaintHeight = ui->widget_rxtx->height()-INTERVAL_WIDGET_TOP-INTERVAL_WIDGET_BOTTOM;
 7     //每隔的间隔高度
 8     float fIntervalHeight = ((float)nActPaintHeight)/(m_nVSingleLinePointCount-1);
 9     float fYPointForZero = ui->widget_rxtx->height()-INTERVAL_WIDGET_BOTTOM;
10     double dDivideValue = 0;
11     if(ui->toolButton_rxflow->isChecked())
12     {
13         dDivideValue = ((double)nRXMaxValue)/(m_nVSingleLinePointCount-1);
14     }
15     if(ui->toolButton_txflow->isChecked())
16     {
17         dDivideValue = ((double)nTXMaxValue)/(m_nVSingleLinePointCount-1);
18     }
19     for(int nIndex=0;nIndex<m_nVSingleLinePointCount;++nIndex)
20     {
21         //设置文本颜色
22         painter.setPen(TEXTCOLOR_WIDGET_PAINT);
23         //将原来的字体变小,设置为8
24         QFont objFont = painter.font();
25         objFont.setPointSize(8);
26         painter.setFont(objFont);
27         //画文本,加3的目的是为了是其和横线能保持中间持平
28         painter.drawText(INTERVAL_VMARK_LEFT,fYPointForZero-nIndex*fIntervalHeight+3,QCommonOP::getKMStrForBit(dDivideValue*nIndex));
29         //设置横线颜色
30         painter.setPen(COORDCOLOR_WIDGET_PAINT);
31         //画横线(第一条和最后一条为实线,中间的为虚线)
32         QPen objPen = painter.pen();
33         if(0==nIndex || (m_nVSingleLinePointCount-1)==nIndex)
34         {
35            objPen.setStyle(Qt::SolidLine);
36         }
37         else
38         {
39             objPen.setStyle(Qt::DashLine);
40         }
41         painter.setPen(objPen);
42         float x1 = ui->widget_rxtx->width()-INTERVAL_WIDGET_RIGHT;
43         float y1 = fYPointForZero-nIndex*fIntervalHeight;
44         painter.drawLine(INTERVAL_HCOORD_LEFT,fYPointForZero-nIndex*fIntervalHeight,x1,y1);
45     }
46     int nActPaintWidth = ui->widget_rxtx->width()-INTERVAL_HCOORD_LEFT-INTERVAL_WIDGET_RIGHT;
47     //每隔的间隔高度--横向:注意使用(float)nActPaintWidth)作为分子,即浮点数
48     float fIntervalWidth = ((float)nActPaintWidth)/(m_nHSingleLinePointCount-1);
49     for(int nIndex=0;nIndex<m_nHSingleLinePointCount;++nIndex)
50     {
51         QPen objPen = painter.pen();
52         if(0==nIndex || (m_nHSingleLinePointCount-1)==nIndex)
53         {
54            objPen.setStyle(Qt::SolidLine);
55         }
56         else
57         {
58             objPen.setStyle(Qt::DashLine);
59         }
60         painter.setPen(objPen);
61         int nXPoint = INTERVAL_HCOORD_LEFT+nIndex*fIntervalWidth;
62         painter.drawLine(nXPoint,INTERVAL_WIDGET_TOP,nXPoint,ui->widget_rxtx->height()-INTERVAL_WIDGET_BOTTOM);
63     }
64     painter.restore();
65 }

时间: 2025-02-01 13:44:40

使用Qt开发绘制多个设备的流量曲线图(附带项目图)的相关文章

嵌入式linux QT开发(一)——QT简介

嵌入式linux QT开发(一)--QT简介 一.QT简介 1.QT简介 QT是一个跨平台的C++图形用户界面库,由挪威TrollTech公司出品,目前包括Qt Creator, QtEmbedded,Qt Designer快速开发工具,Qt Linguist国际化工具等部分,Qt支持所有Linux/Unix系统,还支持Windows平台. 2.QT优点 Qt是一个跨平台的C++图形用户界面应用程序框架,提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能.Qt很容易扩展,并且允许真正地组

QT开发(五十三)———QML基本元素

QT开发(五十三)---QML基本元素 一.基本可视化项 可视元素具有几何坐标,会在屏幕上占据一块显示区域. Item             基本的项元素,所有可视化项都继承Item Rectangle        基本的可视化矩形元素 Gradient         定义一个两种颜色的渐变过程 GradientStop     定义个颜色,被Gradient使用 Image         在场景中使用位图 BorderImage     (特殊的项) 定义一张图片并当做边界 Anima

QT开发(十四)——QT绘图系统

QT开发(十四)--QT绘图系统 一.QT绘图原理 Qt4中的2D绘图系统称为Arthur绘图系统,可以使用相同的API在屏幕上和绘图设备上进行绘制,主要基于QPainter.QPainterDevice和 QPainterEngine.QPainter执行绘图操作,QPainterDevice提供绘图设备,是一个二维空间的抽象,QPainterEngine提供一些接口.QPainter用来执行具体的绘图相关操作,如画点,画线,填充,变换,alpha通道等.QPaintDevice类是能够进行绘

QT开发(二十九)——QT常用类(三)

QT开发(二十九)--QT常用类(三) 一.QImage 1.QImage简介 QT中提供了四个处理图像数据的类:QImage.QPixmap.QBitmap.QPicture. QImage提供了允许直接访问像素数据的硬件无关的图像显示方案,能够用作绘图设备. QImage专门为I/O.直接像素访问操作而设计,并进行了优化.访问图片的像素或是修改图片像素,则需要使用QImage,或者借助于QPainter来操作像素. 由于QImage继承自QPaintDevice,QPainter可以直接在Q

QT开发(三十九)——GraphicsView框架

QT开发(三十九)--GraphicsView框架 本文主要翻译自QT 5.6.2GraphicsView官方文档 一.GraphicsView框架简介 QT4.2开始引入了Graphics View框架用来取代QT3中的Canvas模块,并作出了改进,Graphics View框架实现了模型-视图结构的图形管理,能对大量图元进行管理,支持碰撞检测,坐标变换和图元组等多种方便的功能. GraphicsView框架结构主要包含三个主要的类QGraphicsScene(场景).QGraphicsVi

QT开发(十六)——QT绘图实例-钟表

QT开发(十六)--QT绘图实例-钟表 一.钟表实现原理 钟表的实现需要设置定时器,定时器每隔一秒发送timeout()信号到QWidget::update()槽函数,update()槽函数将会重绘一次窗口,重写重绘事件函数paintEvent(QPaintEvent *event),根据获取的当前系统时间的时钟.分钟.秒钟重绘钟表的时针.分针.秒针. QTimer *timer = new QTimer(this); timer->start(1000);//一秒钟 connect(timer

QT开发(六十三)——QT事件机制分析

QT开发(六十三)--QT事件机制分析 一.事件机制 事件是由系统或者QT平台本身在不同的时刻发出的.当用户按下鼠标.敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件.一些事件在对用户操作做出响应时发出,如键盘事件等:另一些事件则是由系统自动发出,如计时器事件. 事件的出现,使得程序代码不会按照原始的线性顺序执行.线性顺序的程序设计风格不适合处理复杂的用户交互,如用户交互过程中,用户点击"打开文件"将开始执行打开文件的操作,用户点击"保存文件"将开始执

QT开发(二十七)——QT常用类(一)

QT开发(二十七)--QT常用类(一) 一.QString 1.QString简介 QString提供了Unicode编码的字符串,使用隐式共享技术来节省内存和不必要的数据拷贝,不必考虑跨平台的兼容性. QString类成员函数中除了 ascii().latin1().utf8().local8Bit()函数,其他所有的函数都是可重入的. 2.QString成员函数 QString::QString ( const QChar * unicode, int size ) QString::QSt

QT开发(五)——窗口组件和窗口类型

QT开发(五)--窗口组件和窗口类型 一.窗口组件 图形用户界面由不同的窗口和窗口组件构成,<QtGui>头文件包含窗口组件,对应QT中的GUI模块,QT以组件对象的方式构建GUI. 组件的类型: A.容器类(父组件)用来包含其他的界面组件 B.功能类(子组件)用于实现特定的交互功能 QT中没有父组件的顶级组件叫窗口. QWidget是容器组件,继承自QObject类和QPaintDevice类,QObject类是所有支持QT对象模型的基类,QPaintDevice类是QT中所有可绘制组件的基