动漫做暧视频网站,改图网网站谁做的,佛山专业的免费网站优化,品牌建设总结报告1、概述 源码放在文章末尾
该项目实现了带动画、带交互的折线图#xff0c;包含如下特点#xff1a; 动态增删数值 自适应显示坐标轴数值 鼠标悬浮显示十字对准线 鼠标靠近点自动贴附 支持直线与平滑曲线效果 自定义点的显示类型与大小 自适应点的数值显示位置 根据指定锚点…1、概述 源码放在文章末尾
该项目实现了带动画、带交互的折线图包含如下特点 动态增删数值 自适应显示坐标轴数值 鼠标悬浮显示十字对准线 鼠标靠近点自动贴附 支持直线与平滑曲线效果 自定义点的显示类型与大小 自适应点的数值显示位置 根据指定锚点缩放 平滑的横向移动 选中的纵向渐变效果
项目demo演示如下所示
项目部分代码如下所示
#ifndef LINECHART_H
#define LINECHART_H#include QObject
#include QWidget
#include QList
#include QPainter
#include QPainterPath
#include QPropertyAnimation
#include QtMathstruct ChartData
{QString title;QColor color Qt::black;int xMin 0;int xMax 0;int yMin 0;int yMax 0;QListQPoint points;QListQString xLabels; // X显示的名字可空比如日期
};struct Vector2D : public QPointF
{Vector2D(double x, double y) : QPointF(x, y){}Vector2D(QPointF p) : QPointF(p){}/// 向量长度double length(){return sqrt(x() * x() y() * y());}/// 转单位向量Vector2D normalize(){double len length();double inv;if (len 1e-4)inv 0;elseinv 1 / length();return Vector2D(x() * inv, y() * inv);}/// 向量相加Vector2D operator (Vector2D v){return Vector2D(x() v.x(), y() v.y());}/// 向量翻倍Vector2D operator* (double f){return Vector2D(x() * f, y() * f);}/// 内积double dot(Vector2D v){return x() * v.x() y() * v.y();}/// 两个向量夹角double angle(Vector2D v){return acos(dot(v) / (length() * v.length())) * 180 / M_PI;}
};class LineChart : public QWidget
{Q_OBJECTQ_PROPERTY(int display_x_min READ getDisplayXMin WRITE setDisplayXMin)Q_PROPERTY(int display_x_max READ getDisplayXMax WRITE setDisplayXMax)Q_PROPERTY(int display_y_min READ getDisplayYMin WRITE setDisplayYMin)Q_PROPERTY(int display_y_max READ getDisplayYMax WRITE setDisplayYMax)public:LineChart(QWidget *parent nullptr);int lineCount() const;void setPointLineType(int t);void setPointValueType(int t);void setPointDotType(int t);void setPointDotRadius(int r);void setLabelSpacing(int s);void addLine(ChartData data);void removeLine(int index);void addPoint(int index, int x, int y);void addPoint(int index, int x, int y, const QString label);void removeFirst(int index);void updateAnchors();void zoom(double prop);void moveHorizontal(int x);signals:void signalSelectRangeChanged(int start, int end);public slots:void zoomIn();void zoomOut();protected:void paintEvent(QPaintEvent *event) override;void enterEvent(QEvent *event) override;void leaveEvent(QEvent *event) override;void mouseMoveEvent(QMouseEvent *event) override;void mousePressEvent(QMouseEvent *event) override;void mouseReleaseEvent(QMouseEvent *event) override;void wheelEvent(QWheelEvent *event) override;private:void setDisplayXMin(int v);int getDisplayXMin() const;void setDisplayXMax(int v);int getDisplayXMax() const;void setDisplayYMin(int v);int getDisplayYMin() const;void setDisplayYMax(int v);int getDisplayYMax() const;void saveRange();void startRangeAnimation();QPropertyAnimation* startAnimation(const QByteArray property, int start, int end, bool* flag, int duration 300, QEasingCurve curve QEasingCurve::OutQuad);int getValueByCursorPos(QPoint pos);private:// 数据QListChartData datas; // 所有折线的数据// 界面QRect contentRect; // 显示的范围实时刷新QRect paddings QRect(32, 32, 32, 32); // 四周留白(widthright,heightbottom)QColor borderColor Qt::gray; // 边界线颜色int labelSpacing 2; // 标签间距// 信息显示bool autoResize true; // 自动调整大小int displayXMin 0, displayXMax 0; // 显示的X轴范围int displayYMin 0, displayYMax 0; // 显示的Y轴范围bool usePointXLabels true; // 优先使用点对应的label还是相同间距的数值QListQString xLabels; // 显示的文字可能少于值数量QListint xLabelPoss;int pointLineType 3; // 连线类型1直线2二次贝塞尔曲线3三次贝塞尔曲线更精确但吃性能int pointValueType 2; // 数值显示位置0无1强制上方2自动附近int pointDotType 1; // 圆点类型0无1空心圆2实心圆3小方块int pointDotRadius 2; // 圆点半径// 动画效果bool enableAnimation true;int _savedXMin, _savedXMax; // 修改前的数值int _savedYMin, _savedYMax;bool animatingXMin false, animatingXMax false; // 是否正在动画中bool animatingYMin false, animatingYMax false;int _animatedXMin, _animatedXMax; // 动画中的数值仅影响显示int _animatedYMin, _animatedYMax;// 交互数据bool pressing false;QPoint pressPos, releasePos;bool hovering false;QPoint hoverPos;int nearDis 8; // 四周这些距离内算是“附近”// 悬浮提示bool showCrossOnPressing true; // 按下显示十字对准线QColor hightlightColor QColor(#FF7300); // 高亮颜色// 鼠标选择bool enableSelect true;bool selecting false;int selectPos 0; // 最后一次鼠标点击的X像素相对显示矩形int selectXStart 0, selectXEnd 0; // 鼠标按下/松开的对应X值位置QColor selectColor QColor(#F08080); // 选择区域颜色// 缩放(仅针对X轴)bool enableScale true;int displayXStart 0, displayXEnd 0;
};#endif // LINECHART_H源码下载