案例分享: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


相关文章
|
16天前
|
开发框架 网络协议 数据库
Qt:构建跨平台应用的强大框架
Qt:构建跨平台应用的强大框架
|
2月前
|
Linux iOS开发 UED
探索Qt折线图之美:一次详尽的多角度解析
探索Qt折线图之美:一次详尽的多角度解析
173 0
|
2月前
|
存储
QT图形视图框架绘制曲线图和Smith图
QT图形视图框架绘制曲线图和Smith图
23 0
|
3月前
|
IDE 开发工具 C++
QT案例IDE编写 -- 创建项目
QT案例IDE编写 -- 创建项目
28 0
|
3月前
|
数据挖掘 C++
QT基础入门——项目案例(七)
QT基础入门——项目案例(七)
101 0
QT基础入门——项目案例(七)
|
16天前
|
开发框架 自然语言处理 Linux
Qt:构建强大跨平台应用程序的框架
Qt:构建强大跨平台应用程序的框架
|
12天前
|
开发框架 编译器 C++
Qt:一个强大的跨平台C++应用程序开发框架
Qt:一个强大的跨平台C++应用程序开发框架
30 1
|
12天前
|
开发框架 Linux C++
Qt:强大的跨平台C++应用程序开发框架
Qt:强大的跨平台C++应用程序开发框架
44 3
|
16天前
|
XML 网络协议 关系型数据库
Qt框架概述与应用实例
Qt框架概述与应用实例
16 0
|
2月前
|
算法 API C++
Qt框架与STL库之间的巅峰对决:差异、优缺点及适用场景
Qt框架与STL库之间的巅峰对决:差异、优缺点及适用场景
160 0