QCustomePlot是一个可跨平台应用的开源库,可以创建自定义的Plot;而且集成简单,只需要在项目中加入头文件qcustomplot.h和qcustomplot.cpp文件,然后使一个widget提升为QCustomPlot类,即可使用。
本实例应用是使用此开源库创建带游标测量的Plot.
先上效果图
创建一个自定义plot类,继承自QCustomPlot.
#ifndef MULTICURVESPLOT_H
#define MULTICURVESPLOT_H
#include <QObject>
#include "qcustomplot.h"
#include <QMouseEvent>
#include <QMap>
#include "qDebug.h"
typedef struct _CurveData
{
QVector<double> keyVec;//x
QVector<double> valVec;//y
}CurveData;//单个曲线的数据
/*
注意:调用任何函数前,必须先已经通过init函数初始化过支持的曲线数目,送入数据源的指针
为什么不直接在构造中
*/
class MultiCurvesPlot : public QCustomPlot
{
Q_OBJECT
public:
/*传入的_allCurvesData必须是有size的*/
MultiCurvesPlot(int _curvesCnt, QWidget *parent = 0);
~MultiCurvesPlot(){qDebug() << "delete MultiCurvesPlot";}
void setCurvesName(QVector<QString> _nameVec);
void addData(int curveIdx, double x, double y);
void setAutoScroll(bool enable){autoScroll = enable;}
void setDiffSolveEnable(bool enable);
void setColors(QVector<QColor> _colors);
void setMainPlot(QCustomPlot *_mainPlot);
void setTracerEnable(bool enable);//是否使能游标
void setScatterPointEnable(bool enable);//是否使能散点
const QVector<CurveData> *getAllData(void) const;
QString getCurveName(int idx);
public slots:
void setCurveName(int idx, const QString newName);
void showCurves(QList<uint16_t> _idxList);
void storeAxisScope(bool x, bool y);//保存轴的范围
void resumeAxisScope(bool x, bool y);//恢复轴的范围
signals:
void noniusValueChanged(int _curveIdx, QString val);//游标值变化了
protected:
void timerEvent(QTimerEvent *event) Q_DECL_OVERRIDE;
virtual void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
virtual void mouseMoveEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
virtual void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
// virtual void keyPressEvent(QKeyEvent *event) Q_DECL_OVERRIDE;
// virtual void keyReleaseEvent(QKeyEvent *event) Q_DECL_OVERRIDE;
private slots:
void clearAllData();
void when_selectionChangedByUser();
//void when_itemDoubleClick (QCPAbstractItem *item, QMouseEvent *event){qDebug() << item;}
void when_legendDoubleClick(QCPLegend *legend, QCPAbstractLegendItem *item, QMouseEvent *event);
private:
//QCPGraph* getGraph(int curveIdx);
MultiCu