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

2023-10-26

一、说明:

在实际项目中,主要是使用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 }



from: http://www.cnblogs.com/appsucc/p/3542557.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Qt5调用QPixmap::fromWinHICON

    QPixmap QPixmap fromWinHICON HICON icon static Win32 only Returns a QPixmap that is equivalent to the given icon Warning
  • 使用Qt开发绘制多个设备的流量曲线图(附带项目图)

    一 说明 在实际项目中 主要是使用Qt开发CS程序 当然主要是客户端 公司项目中有这个需求是实时显示多个设备的流量曲线图 设备将流量信息发给服务端 服务端再将信息通过Socket发给Qt客户端 Qt客户端通过Socket接收后实时显示在程序
  • Qt 学习之路 2(23):自定义事件

    尽管 Qt 已经提供了很多事件 但对于更加千变万化的需求来说 有限的事件都是不够的 例如 我要支持一种新的设备 这个设备提供一种崭新的交互方式 那么 这种事件如何处理呢 所以 允许创建自己的事件 类型也就势在必行 即便是不说那种非常极端的例
  • QT事件--阐述的比较系统

    转载 http www qtcn org bbs simple t31383 html Another Look at Events 再谈Events 最近在学习Qt事件处理的时候发现一篇很不错的文章 是2004年季刊的一篇文章 网上有这篇
  • Qt之键盘事件无法响应问题

    Qt之键盘事件无法响应问题 概述 代码 over 文末一句话 概述 新公司的加班第一天 在调试公司项目代码时发现个小问题 鼠标 键盘事件都已写好 但是键盘事件无效无法进入断点 接来下去查文档并没有查到相关说明 翻阅百度翻到如下代码 并进行测
  • LinearGradient线性渲染

    java view plain copy import android content Context import android graphics Canvas import android graphics Color import
  • 使用Qt创建模拟时钟

    main cpp include
  • 关于Qt 中update()和repaint()的区别

    void QWidget repaint int x int y int w int h bool erase TRUE 槽 通过立即调用paintEvent 来直接重新绘制窗口部件 如果erase为真 Qt在paintEvent 调用之前
  • Qt中的焦点事件

    在应用程序中 都会有一个当前窗口 即当前获得焦点事件的窗口 这个窗口可以接受键盘的输入 当应用有多个窗口时就要使用焦点事件了 Qt中有很好的焦点事件管理 我在这里抛砖引玉了 一个空间要先设置它焦点事件的模式 即窗口如何接受焦点事件 通过鼠标
  • setFocus不能生效的问题

    focusInEvent只有在对象显示出来的情况下设定setFocus才可以触发 这一点help手册里有说明 转一篇文章如下 http blog csdn net alex201030273437 article details 81937
  • Qt使用QGraphicsView实现滑动窗体效果

    源码已上传至CSDN http download csdn net source 2808505 QGraphicsView用来显示一个滚动视图区的QGraphicsScene内容 QGraphicsScene提供了QGraphicsIte
  • QEventLoop源码

    Copyright C 2015 The Qt Company Ltd Contact http www qt io licensing This file is part of the QtCore module of the Qt To
  • Qt键盘事件

    ifndef COMPLETELINEEDIT H define COMPLETELINEEDIT H include
  • Qt学习笔记八 二维图形(2) 坐标系统变换

    在 Qt 中 可以改变系统默认的屏幕坐标系 在 QPainter 默认的坐标系中 点 0 0 位于屏幕的左上角 X 轴向右 Y 轴向下 每个像素占 1x1 大小 1 移动坐标系 改变坐标系原点 0 0 位置 通过 QPainter setW
  • Qt实现图像自适应窗口大小之scaled()函数使用

    很多应用都需要显示图片 比如视频类应用 拍照类应用 但是在大数情况下用户都会改变窗口大小 以获得最佳效果 在Qt中如果只设置了显示图片而没有对自适应窗口做出设置 用户拖拽边框的时候 整个控件上就会出现大片空白部分 怎么解决这个问题呢 QIm
  • Qt绘图编程-绘制多边形、椭圆、多条直线

    1 说明 所有的绘图操作是在绘图事件中进行 mainwindow h ifndef MAINWINDOW H define MAINWINDOW H include
  • 【Qt】Qt事件系统

    00 目录 文章目录 00 目录 01 Qt事件系统概述 02 事件如何传递 03 事件类型 04 事件处理 05 事件过滤器 06 事件发送 附录 01 Qt事件系统概述 Qt 5 12 Qt Core The Event System
  • Qt4.8.2 QPushButton按钮贴图以及实现按钮的几种常用状态

    一 继承自QPushButton 不改变图片本身 而是通过改变按钮背景的透明度 myPushButton h cpp view plain copy ifndef MYPUSHBUTTON H define MYPUSHBUTTON H i
  • 简单的QT绘图程序

    当初在学MFC时 最经典的入门实例就是绘图程序 其作用相当于Console Application 下的Hello World了吧 如今入手QT 不免怀旧 于是也写了一个绘图程序 虽然简单 却也是入门必备啊 环境 OS Ubuntu 11
  • Qt中父子widget的事件传递

    以前我一直以为 在父widget上摆一个子widget后 当click子widget时 只会进入到子widget的相关事件处理函数中 比如进入到mousePressEvent 中 而不会进入到父widget的对应事件处理函数中 毕竟 cli

随机推荐

  • 【网站汇总】一些OJ平台

    目录 前言 一 HDU孵化器 二 HDU OJ 三 PTA 四 洛谷 五 力扣 LeetCode 前言 以下是一些OJ平台 一 HDU孵化器 链接 http hdufhq cn 8888 二 HDU OJ 链接 http code hdu
  • Linux下删除正在写入的文件会发生什么?

    一 成功 删除 了一个正在写入的文件 某日 我启动了一个进程 向一个文件a txt中写入内容 但不小心在另一个窗口用命令rm f a txt把它删除了 我以为这应该会触发一个警告 比如 不能删除一个打开的正在写入的文件 之类的 结果命令干脆
  • WinServer 2012 AD 组策略 用户发布软件部署

    本例演示安装 Notepad 这款软件 因为域中发布软件只支持 msi 格式 所以要把 exe 转成 msi 格式 可以用这个软件 https www advancedinstaller com 1 转换格式 1 选择 MSI from E
  • 数学建模 - 数学规划

    来自清风的数学建模课程 主要是用于自己复习看 所以截图较多 数学规划 概述 分类 线性规划 非线性规划 整数规划 0 1规划 线性规划 对于求解最大值要让目标函数的系数 max z min z 线性规划公式 x fval linprog c
  • 第十四届蓝桥杯模拟赛(第一期)——C语言版

    1 二进制位数 问题描述 十进制整数 2 在十进制中是 1 位数 在二进制中对应 10 是 2 位数 十进制整数 22 在十进制中是 2 位数 在二进制中对应 10110 是 5 位数 请问十进制整数 2022 在二进制中是几位数 incl
  • PHP导出excel文件的几种方式

    先说说动态生成的内容当作文件来下载的方法 1 通过把Content Type设置为application octet stream 可以把动态生成的内容当作文件来下载 content type内容设置可以参看 http www ostool
  • 父类对象的属性直接赋值给子类对象(使用copyProperties中的方法copyProperties)

    BeanUtils copyProperties 是 Apache Commons BeanUtils 包中提供的一个方法 用于将一个 JavaBean 对象的属性值赋值到另一个 JavaBean 对象中 该方法可以简化 JavaBean
  • springmvc @ResponseBody参数解析核心代码分析 -8

    org springframework web servlet mvc method annotation RequestResponseBodyMethodProcessor supportsParameter 只要参数上有 Reques
  • BAPI_ACC_DOCUMENT_POST用法

    文章目录 1 Overall 2 Code 1 Overall The blog will demostrate how to use BAPI ACC DOCUMENT POST We use enhancement for it 2 C
  • 所有子集 剑指 Offer II 079

    我只是喜欢敲代码 目录 题目描述 AC代码 思路分析 题目描述 给定一个整数数组 nums 数组中的元素 互不相同 返回该数组所有可能的子集 幂集 解集 不能 包含重复的子集 你可以按 任意顺序 返回解集 示例 1 输入 nums 1 2
  • springboot多数据源配置

    之前在介绍使用JdbcTemplate和Spring data jpa时 都使用了单数据源 在单数据源的情况下 Spring Boot的配置非常简单 只需要在application properties文件中配置连接参数即可 但是往往随着业
  • Angular_构建&部署&多环境

    构建 构建 编译和合并 部署 与服务器整合 ng build 使用命令ng build进行构建 构建完成以后 会在项目中多出一个dist文件夹 部署 在服务器端新建一个文件夹client 将dist文件夹中的文件复制粘贴到cleint文件夹
  • TCP选项之SO_RCVBUF和SO_SNDBUF

    SO RCVBUF SO SNDBUF 先明确一个概念 每个TCP socket在内核中都有一个发送缓冲区和一个接收缓冲区 TCP的全双工的工作模式以及TCP的滑动窗口便是依赖于这两个独立的buffer以及此buffer的填充状态 接收缓冲
  • 03-----生产环境 CPU 占用过高,你如何解决?

    1 top指令 top 找出占用 CPU 最高的进程的 pid 2 查看耗CPU的线程号 方法1 top Hp 进程号 然后按下大写P 在该进程中找到 哪些线程占用的 CPU 最高的线程 记录下 tid 注意下图一个是主线程 其余是子线程
  • sqlalchemy数据库连接池QueuePool异常

    数据库相关错误的解决办法 错误一 数据库连接池超过限制 SqlAlchemy QueuePool limit overflow 造成连接数超过数据库连接池的限制 有两方面的原因 第一个是由于数据库连接池数比较小 因此当连接数稍微增加的时候就
  • IDDPM官方gituhb项目--模型构建

    在完成IDDPM论文学习后 对github上的官方仓库进行学习 通过具体的代码理解算法实现过程中的一些细节 官方仓库代码基于pytorch实现 链接为https github com openai improved diffusion 本笔
  • studyreport

    Vi Java Ant Junit的自学报告 1 vi vim编辑器的使用 1 1 vi vim简介 vi编辑器是Linux和Unix上最基本的文本编辑器 工作在字符模式下 由于不需要图形界面 vi是效率很高的文本编辑器 它可以执行输出 删
  • HTML侧面导航栏

  • 函数的模拟实现

    目录 题一 qsort 练习使用库函数 qsort排序各种类型的数据 模拟实现qsort在不同情形的实现 题二 strlen 模拟实现strlen 优解一 优解二 优解三 题三 strcpy 模拟实现strcpy 优解一 题四 strcmp
  • 使用Qt开发绘制多个设备的流量曲线图(附带项目图)

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