若該文為原創文章,轉載請注明原文出處
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/111660400
長期持續帶來更多專案與技術分享,咨詢請加QQ:21497936、微信:yangsir198808
紅胖子(紅模仿)的博文大全:開發技術集合(包含Qt實用技術、樹莓派、三維、OpenCV、OpenGL、ffmpeg、OSG、單片機、軟硬結合等等)持續更新中…(點擊傳送門)
開發專欄:專案實戰
需求
??1. 雙Y軸段曲線;
??2. 拽拖分析已有資料;
??3. 支持懸浮顯示當前最近x的各段y坐標;
??4. 優化顯示性能以及快取;
??5. 支持各種有顏色的調整‘;
??6. 讀取檔案或者下位機資料;
注意
??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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/240916.html
標籤:其他
上一篇:廣度優先搜索演算法BFS
