案例分享:Qt多段Y轴折线图框架(双Y轴段折线、支持拽拖、浮动游标显示X值各段Y值、支持大量实时显示下位机数据)

简介: 案例分享:Qt多段Y轴折线图框架(双Y轴段折线、支持拽拖、浮动游标显示X值各段Y值、支持大量实时显示下位机数据)

需求

  1. 双Y轴段曲线;

  2. 拽拖分析已有数据;

  3. 支持悬浮显示当前最近x的各段y坐标;

  4. 优化显示性能以及缓存;

  5. 支持各种有颜色的调整‘;

  6. 读取文件或者下位机数据;


相关博客

  《案例分享:Qt高频fpga采集数据压力位移速度加速度分析系统(通道配置、电压转换、采样频率、通道补偿、定时采集、距离采集,导出exce、自动XY轴、隐藏XY轴、隐藏显示通道,文件回放等等)

  《案例分享:Qt多段Y轴折线图框架(双Y轴段折线、支持拽拖、浮动游标显示X值各段Y值、支持大量实时显示下位机数据)

  《案例分享:Qt便携式致病菌快速检测仪(账号管理、实验过程、二维图表、历史数据、通讯管理、实验报告、中英文等等)

  《案例分享:Qt多通道数据采集系统(通道配置、电压转换、采样频率、通道补偿值、定时采集、导出excel和图表、自动XY轴、隐藏XY轴、实时隐藏显示通道)

  《Qt开发笔记之QCustomPlot:QCustomPlot介绍、编译与使用

  《Qt开发笔记之Qwt(一):Qwt介绍、编译与Demo


注意

  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


相关文章
|
3月前
|
算法 计算机视觉
基于qt的opencv实时图像处理框架FastCvLearn实战
本文介绍了一个基于Qt的OpenCV实时图像处理框架FastCvLearn,通过手撕代码的方式详细讲解了如何实现实时人脸马赛克等功能,并提供了结果展示和基础知识回顾。
147 7
|
3月前
|
文字识别 计算机视觉 开发者
基于QT的OCR和opencv融合框架FastOCRLearn实战
本文介绍了在Qt环境下结合OpenCV库构建OCR识别系统的实战方法,通过FastOCRLearn项目,读者可以学习Tesseract OCR的编译配置和在Windows平台下的实践步骤,文章提供了技术资源链接,帮助开发者理解并实现OCR技术。
177 9
基于QT的OCR和opencv融合框架FastOCRLearn实战
|
5月前
|
网络协议
Qt中的网络编程(Tcp和Udp)运用详解以及简单示范案例
Tcp和Udp是我们学习网络编程中经常接触到的两个通讯协议,在Qt也被Qt封装成了自己的库供我们调用,对于需要进行网络交互的项目中无疑是很重要的,希望这篇文章可以帮助到大家。 是关于Qt中TCP和UDP的基本使用和特点:
829 7
WK
|
1月前
|
开发框架 开发工具 C++
C++跨平台框架Qt
Qt是一个功能强大的C++跨平台应用程序开发框架,支持Windows、macOS、Linux、Android和iOS等操作系统。它提供了250多个C++类,涵盖GUI设计、数据库操作、网络编程等功能。Qt的核心特点是跨平台性、丰富的类库、信号与槽机制,以及良好的文档和社区支持。Qt Creator是其官方IDE,提供了一整套开发工具,方便创建、编译、调试和运行应用程序。Qt适用于桌面、嵌入式和移动应用开发。
WK
73 5
|
3月前
|
计算机视觉
基于QT的opencv插件框架qtCvFrameLearn实战
这篇文章详细介绍了如何基于Qt框架开发一个名为qtCvFrameLearn的OpenCV插件,包括项目配置、插件加载、Qt与OpenCV图像转换,以及通过各个插件学习OpenCV函数的使用,如仿射变换、卡通效果、腐蚀、旋转和锐化等。
60 10
|
3月前
|
C语言 C++ Windows
QT多插件通信框架CTK编译记录
本文记录了编译QT多插件通信框架CTK的过程,包括编译结果截图、部署配置、Log4Qt编译配置、参考链接和拓展资料。文中提供了详细的编译步骤和配置文件示例,以及相关的资源链接。
QT多插件通信框架CTK编译记录
|
4月前
|
存储 C++
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
106 1
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
|
5月前
|
开发者
Qt中的事件该如何学习?(附带案例)
事件是Qt中比较重要的一部分,在初期如果理解不当学习可能会比较困难,这里提一嘴当初教我的那位老师水平是真的高,让我很轻易的就理解了事件的概念。 在平时我们见到那些界面上的某些快捷键就有可能是事件做的,例如ESC关闭窗口,Enter提交或者登录这种类似的,这也是事件的强大之处。
138 0