项目实战:Qt多段Y轴折线图框架(双Y轴段折线、支持拽拖、浮动游标显示X值各段Y值、支持大量实时显示下位机数据)
若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/111660400
长期持续带来更多项目与技术分享,咨询请加QQ:21497936、微信:yangsir198808
红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)
需求
1. 双Y轴段曲线;
2. 拽拖分析已有数据;
2. 支持悬浮显示当前最近x的各段y坐标;
3. 优化显示性能以及缓存;
4. 支持各种有颜色的调整‘;
5. 读取文件或者下位机数据;
注意
Qt相关的二维折线图,采用其他方式都无法实现多段Y轴(非双Y轴,单Y轴多段),包括QCharts、QCustomPlot、Qwt,其他已有的框架内嵌web可实现,基于需要实时采集数据,内嵌web实时体验并不好,于是写了个基础框架,以便实现实时数据的大量采集。
Demo
体验下载地址
CSDN(粉丝免积分下载):https://download.csdn.net/download/qq21497936/13777399
QQ群:1047134658(点击“文件”搜索“chartDemo”,群内与博文同步更新)
V1.1.0
Demo部分源码
#ifndef LINECHART2WIDGET_H
#define LINECHART2WIDGET_H
#include <QWidget>
#include <QColor>
#include <QPainter>
#include <QMouseEvent>
#include <QPointF>
class LineChart2Widget : public QWidget
{
Q_OBJECT
public:
explicit LineChart2Widget(QWidget *parent = nullptr);
public:
void addData(QVector<QPointF> vectorPoint);
void setData(QVector<QPointF> vectorPoint);
void clear();
void addData2(QVector<QPointF> vectorPoint);
void setData2(QVector<QPointF> vectorPoint);
void clear2();
protected:
QPointF realConvertToChart(QPointF pointF); // 实际点转为图表点坐标
QPointF chartConvertToReal(QPointF pointF); // 图表点坐标转为实际点
QVector<QPointF> realConvertToChart(QVector<QPointF> vectorPointF); // 实际点转为图表点坐标
QPointF realConvertToChart2(QPointF pointF); // 实际点转为图表点坐标
QPointF chartConvertToReal2(QPointF pointF); // 图表点坐标转为实际点
QVector<QPointF> realConvertToChart2(QVector<QPointF> vectorPointF); // 实际点转为图表点坐标
protected:
void paintEvent(QPaintEvent *event);
void showEvent(QShowEvent *event);
void resizeEvent(QResizeEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void wheelEvent(QWheelEvent *event);
protected:
void drawBackground(QPainter *painter); // 绘制背景
void drawMarginBackground(QPainter *painter); // 绘制边框背景(边框的)
void drawAxis(QPainter *painter); // 绘制坐标轴
void drawLabel(QPainter *painter); // 绘制坐标值
void drawLines(QPainter *painter); // 绘制曲线
void drawCursorRealValue(QPainter *painter); // 绘制实际值
void drawMouseCross(QPainter *painter); // 绘制鼠标的十字线
void drawTwoValue(QPainter *painter); // 绘制双轴的X,Y值(最近接X轴的上一个Y点)
private:
double _leftMargin; // 左边距离(坐标轴距离左部边框)
double _rightMargin; // 右边距离(坐标轴距离右部边框)
double _bottomMargin; // 底部距离(坐标轴距离底部边框)
double _topMargin; // 顶部距离(坐标轴距离顶部边框)
double _left; // 左部x坐标
double _right; // 右部x坐标
double _top; // 顶部y坐标
double _bottom; // 底部y坐标
double _width; // 宽度
double _height; // 高度
double _minX; // x轴最小值
double _maxX; // x轴最大值
QColor _backgroundColor; // 背景颜色
QColor _axisColor; // 坐标轴颜色
QColor _axisLabelColor; // 坐标轴文本颜色
QColor _lineColor; // 折线颜色
QColor _dataColor; // 矩形文字颜色
QColor _dataBackgroundColor;// 矩形背景颜色
int _xTickCount; // X轴主tick
int _xTickLength; // X轴主tick长度
int _xSubTickCount; // X轴子tick
int _xSubTickLength; // X轴子tick长度
double _xTickDistance; // 临时变量:
double _xSubTickDistance; // 临时变量:
double _xTickValue; // 临时变量:
double _xSubTickValue; // 临时变量:
double _xTickValueScale; // 临时变量:
double _xSubTickValueScale; // 临时变量:
bool _leftButtonPressed; // 临时变量:鼠标左键是否按下
QPointF _originPointF; // 临时变量:记录鼠标左键按下的坐标
QPointF _offsetPointF; // 临时变量:偏移的坐标段
QPointF _zeroPointF; // 零点,用于区分x轴和y轴的坐标
QPointF _nowPointF; // 临时变量:零点
double _scale; // 缩放比例
QVector<QPointF> _vectorPointF; // 一条线的存储位置
QVector<QPointF> _vectorPointF2; // 一条线的存储位置
bool _showCursorRealValue; // 是否显示鼠标当前de的值
bool _canDragYAxis; // Y轴是否允许被拖动
bool _showCrossAxis; // 画十字轴
private:
int _yAxisNumber; // 几段Y轴
int _yAxisSpace; // Y轴间距
double _yAxisHeight; // 每一段Y轴高度
double _offsetY; // 临时变量:
int _yTickCount; // Y轴分的主tick
int _yTickLength; // Y轴主tick长度
int _ySubTickCount; // Y轴两个大tick之间的小tick
int _ySubTickLength; // Y轴子tick长度
double _yTickDistance; // 临时变量:
double _ySubTickDistance; // 临时变量:
private:
QString _yAxisContent; // 第一段Y轴内容
double _yTickValue; // 临时变量:
double _ySubTickValue; // 临时变量:
double _yTickValueScale; // 临时变量:
double _ySubTickValueScale; // 临时变量:
private:
QString _yAxisContent2; // 第一段Y轴内容
double _yTickValue2; // 临时变量:
double _ySubTickValue2; // 临时变量:
double _yTickValueScale2; // 临时变量:
double _ySubTickValueScale2; // 临时变量:
private:
double _minY; // y轴最小值
double _maxY; // y轴最大值
double _minY2; // y轴最小值
double _maxY2; // y轴最大值
double _x; // 十字轴的x坐标
double _y1; // 十字轴的导高值
double _y2; // 十字轴的超出值
};
#endif // LINECHART2WIDGET_H
若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/111660400
项目实战:Qt多段Y轴折线图框架(双Y轴段折线、支持拽拖、浮动游标显示X值各段Y值、支持大量实时显示下位机数据)的更多相关文章
- HighCharts之2D柱状图、折线图的组合多轴图
HighCharts之2D柱状图.折线图的组合多轴图 1.实例源码 SomeAxis.html: <!DOCTYPE html> <html> <head> < ...
- C#使用struct直接转换下位机数据
编写上位机与下位机通信的时候,涉及到协议的转换,比较多会使用到二进制.传统的方法,是将数据整体获取到byte数组中,然后逐字节对数据进行解析.这样操作工作量比较大,对于较长数据段更容易计算位置出错. ...
- iOS Charts 折线图框架的基本使用
1. 导入框架 通过 cocoapods 管理应用程序时,在 Podfile 文件中,use_frameworks! 的使用区别如下: 使用 use_frameworks! 时 dynamic fra ...
- excel制作折线图太麻烦?试试这些折线图在线生成工具
折线图是以折线的上升或下降来表示统计数量的增减变化的统计图,叫作折线统计图.用折线的起伏表示数据的增减变化情况,不仅可以表示数量的多少,而且可以反映数据的增减变化情况.并且折线图也是目前最方便的一种统 ...
- android项目实战 --ListView 头部ViewPager广告轮询图效果
看开源框架:https://github.com/tianshaojie/AndroidFine,里面有如下效果,特记录学习下,以后项目中用也好能够立刻想起来. 如上面所示,是常见项目中的图片轮训 ...
- 【SSH网上商城项目实战03】使用EasyUI搭建后台页面框架
转自:https://blog.csdn.net/eson_15/article/details/51312490 前面两节,我们整合了SSH并且抽取了service和action部分的接口,可以说基 ...
- ucharts的区域图、折线图(有x轴的),修改x轴显示为隔一个显示
1.原本的显示方式: 2.想要的效果: 3.这边我使用的是uchart的组件,在uni_modules > qiun-data-charts > js_sdk > u-charts, ...
- highcharts 柱状图 折线图 混合 双纵轴显示
$(function () { $('#container').highcharts({ chart: { zoomType: 'xy' }, title: { text: '' }, colors: ...
- 项目实战:Qt多通道数据采集系统(通道配置、电压转换、采样频率、通道补偿值、定时采集、导出exel和图表、自动XY轴、隐藏XY轴、实时隐藏显示通道)
需求 1.通道使能.选择.更改通道名称.设置显示颜色 2.采样率可设置(Sa/s/chj) 3.单位换算,按照给定的进行换算 4.对通道可进行设置补偿值 5.通道取消可动态显示和隐藏,并可 ...
- JavaScript数据可视化编程学习(一)Flotr2,包含简单的,柱状图,折线图,饼图,散点图
一.基础柱状图 二.基础的折线图 三.基础的饼图 四.基础的散点图 一.基础柱状图 如果你还没有想好你的数据用什么类型的图表来展示你的数据,你应该首先考虑是否可以做成柱状图.柱状图可以表示数据的变化过 ...
随机推荐
- [转帖]如何在Linux系统中使用命令发送邮件
https://zhuanlan.zhihu.com/p/96897532 Linux系统更多的被用来做服务器系统,在运维的过程中难免我们需要编写脚本监控一些指标并定期发送邮件. 本教程将介绍如何在L ...
- ebpf 单行程序学习
ebpf 单行程序学习 背景 公司方神借给我一本: <BPF之巅:洞悉linux系统和应用性能>纸质书 拿回家晚上在沙发上看了几天. 感觉书很厚看的不是很系统. 仅能凭自己的感觉总结一下这 ...
- [转帖]一次 Java 进程 OOM 的排查分析(glibc 篇)
https://juejin.cn/post/6854573220733911048 遇到了一个 glibc 导致的内存回收问题,查找原因和实验的的过程是比较有意思的,主要会涉及到下面这些: Linu ...
- [转帖]linux 下 {}大括号的用法
我们平时使用Linux的时候经常遇到这样一个问题,举例有这样一种情况:执行命令 $ cp /etc/apt/sources.list /etc/apt/sources.list.bak 这里面有个问题 ...
- [转帖]Ceph优化系列(四):RocksDB 使用 ARM 64 位 CRC32C 硬件优化指令
一.前言 CRC32(A cyclic redundancy check 32)应用于校验,为了保证数据的正确性,采用的一种检错手段. CRC32C (CRC32 Castagnoli) 与 CRC ...
- K8S的pod展示镜像信息
https://kubernetes.io/zh/docs/tasks/access-application-cluster/list-all-running-container-images/ ku ...
- vue3关于.sync的用法
场景描述 我们都知道,子组件是不能够去修改父组件传递过来的数据. 因为如果子组件去修改父组件件传递过来的数据. 会导致数据的应用流向变得难以理解. 但是有些时候,我们需要当子组件的数据变化后,父组件的 ...
- 通杀无限 debugger,目前只有 1% 的人知道!
前言 相信很多小伙伴在进行 web 逆向的时候,都遇到过无限 debugger.最简单的方法,在 debugger 位置,点击行号,右键 Never pause here,永远不在此处断下即可.但是这 ...
- 爬虫逆向基础,认识 SM1-SM9、ZUC 国密算法
关注微信公众号:K哥爬虫,QQ交流群:808574309,持续分享爬虫进阶.JS/安卓逆向等技术干货! [01x00] 简介 国密即国家密码局认定的国产加密算法,爬虫工程师在做 JS 逆向的时候,会遇 ...
- 紧跟潮流,抓住趋势,跟上全民AI的节奏,开源IM项目OpenIM产品介绍,为AIGC贡献力量
开源价值 高度自主.安全可控.开放自由,私有化部署,一切皆可控 透明度和可信度:开源软件的源代码是公开的,任何人都可以查看和检查代码,从而增强了软件的透明度和可信度.用户可以了解软件的内部结构和运作方 ...