123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331 |
- #ifndef CUSTOMPLOT_H
- #define CUSTOMPLOT_H
- /**
- * QCustomPlot控件封装
- * 1. 可设置X轴Y轴范围值
- * 2. 可设置背景颜色+文本颜色+网格颜色
- * 3. 可设置三条曲线颜色+颜色集合
- * 4. 可设置是否显示定位十字线,可分别设置横向和纵向
- * 5. 可设置十字线的宽度和颜色
- * 6. 可设置是否显示数据点以及数据点的大小
- * 7. 可设置是否填充背景形成面积图
- * 8. 可设置模式-拖动+缩放等
- * 9. 可设置坐标轴间距+第二坐标系可见
- * 10. 提供接口setDataLine直接设置曲线,支持多条
- * 11. 提供接口setDataBar直接设置柱状图,支持多条形成堆积图
- * 12. 提供接口setLabs设置文本标签替代key,包括X轴和Y轴
- * 13. 提供清空数据+重绘图表+外部获取QCustomPlot对象,这样就可以进行更加详细的参数设置
- * 14. 提供函数start+stop来模拟正弦曲线
- * 15. 可设置柱状图的值的位置+精确度+颜色
- * 16. 支持鼠标移动到数据点高亮显示数据点以及显示数据提示信息
- * 17. 可设置提示信息位置 自动处理+顶部+右上角+右侧+右下角+底部+左下角+左侧+左上角
- * 18. 可设置是否校验数据产生不同的背景颜色,比如柱状图的每根柱子都可以根据数据生成不同背景颜色
- * 19. 可设置是否显示图例+图例位置+图例行数以及图例单行显示
- * 20. 支持多条曲线+柱状图+柱状分组图+横向柱状图+横向分组图+柱状堆积图
- * 21. 内置15套精美颜色,自动取颜色集合的颜色,省去配色的烦恼
- * 22. 每条柱状图都可以设置不同的颜色,分组柱状图可以设置颜色交替
- * 23. Y轴数值支持百分比显示,可拓展成其他格式
- * 24. 内置平滑曲线算法,支持平滑曲线绘制,传入点集合即可
- * 25. 同时支持 QCustomPlot 1.0 和 QCustomPlot 2.0
- * 26. 支持Qt4-Qt5任意Qt版本,支持任意编译器+任意操作系统
- */
- #include "QCustomPlot/CustomPlotHelper.h"
- #include "QCustomPlot/CustomplotTracer.h"
- #include "Common.h"
- #include "VControlObject.h"
- // 扩展属性的组名
- #define CUSTOM_PLOT_PROPERTY_EX_NAME "曲线图"
- #define CUSTOM_PLOT_PROPERTY_EX_REFRESHLINK_NAME "索引链接"
- #define CUSTOM_PLOT_PROPERTY_EX_GROUP_NAME "曲线信息"
- #define CUSTOM_PLOT_PROPERTY_EX_SUBGROUP_NAME "曲线"
- #define CUSTOM_PLOT_PROPERTY_EX_VALUE_NAME "线名"
- #define CUSTOM_PLOT_PROPERTY_EX_COLOR_NAME "曲线颜色"
- #define CUSTOM_PLOT_PROPERTY_EX_LINEWIDTH_NAME "曲线线宽"
- #define CUSTOM_PLOT_PROPERTY_EX_LINK_NAME "数据链接"
- // 默认数值
- #define CUSTOM_PLOT_DEFAULT_LINEWIDTH 1
- // 曲线数的属性名称
- #define CUSTOM_PLOT_COUNT_NAME "lineCount"
- // 属性子分组编号(Pie目前只有一个扩展属性组)
- #define GROUP_INDEX_CUSTOM_PLOT 0
- /// <summary>
- /// 自定义曲线图控件
- /// </summary>
- class VCustomPlot : public QWidget, public VControlObject
- {
- Q_OBJECT
-
- Q_PROPERTY(QRect geometry READ geometry WRITE setGeometry)
-
- Q_PROPERTY(QString title READ getText WRITE setText)
- Q_PROPERTY(int lineCount READ getCustomPlotCount WRITE setCustomPlotCount)
- Q_PROPERTY(QColor bgColor READ getBgColor WRITE setBgColor)
- Q_PROPERTY(int interactions READ getInteractions WRITE setInteractions)// 交互模式
- Q_PROPERTY(int drawingMode READ getDrawingMode WRITE setDrawingMode)// 绘图模式
- Q_PROPERTY(QSize rangeX READ getRangeX WRITE setRangeX)// 表格范围
- Q_PROPERTY(int tickCountX READ getTickCountX WRITE setTickCountX)// X轴格子数量
- Q_PROPERTY(QSize rangeY READ getRangeY WRITE setRangeY)// 表格范围
- Q_PROPERTY(int tickCountY READ getTickCountY WRITE setTickCountY)// Y轴格子数量
-
- public:
- VCustomPlot(
- QWidget* parent,
- const QPoint& pos,
- const QSize& size,
- CONTROL_PROPERTY* pProperty = nullptr,
- CONTROL_PROPERTY_EX* pPropertyEx = nullptr
- );
- protected:
- void showEvent(QShowEvent*);
- void resizeEvent(QResizeEvent*);
- private:
- QString colorNames; //颜色名称集合
- lcolor colors; //颜色集合
- int gridWidth; //网格宽度
- QColor gridColor; //网格颜色
- int lineWidth; //十字线宽度
- QColor lineColor; //十字线颜色
- bool showLineh; //显示横线
- bool showLinev; //显示竖线
- int fontSize; //字体大小
- int pointSize; //数据点大小
- double offsetX; //X轴范围偏移
- double offsetY; //Y轴范围偏移
- int toolTipPosition; //提示信息位置
- int interactions; //交互模式-鼠标拖动滚轮缩放等
- int padding; //坐标轴边距
- bool axis2Visible; //第二坐标轴可见
- bool percentY; //Y轴百分比显示
- bool isLoad; //是否加载过
- QList<QCPBars*> bars; //存储柱状图集合
- QCustomPlot* customPlot; //曲线图表对象
- QCPScatterStyle scatterStyle; //曲线数据样式
- CustomPlotTracer* layerable; //游标层
- QCPItemTracer* tracer; //数据点指示器
- QCPItemText* textTip; //提示信息
- QCPBars* staticBarv; //静态柱状图
- private slots:
- //响应鼠标移动
- void mouseMove(QMouseEvent* event);
- //计算提示信息位置
- void checkToolTip(double& x, double& y);
- public:
- lcolor getColors() const;
- QString getColorNames() const;
- QColor getBgColor() const;
- QColor getTextColor() const;
- int getGridWidth() const;
- QColor getGridColor() const;
- int getLineWidth() const;
- QColor getLineColor() const;
- bool getShowLineh() const;
- bool getShowLinev() const;
- int getFontSize() const;
- int getPointSize() const;
- double getOffsetX() const;
- double getOffsetY() const;
- int getToolTipPosition() const;
- int getInteractions() const;
- int getDrawingMode() const;
- int getTickCountX() const;
- int getTickCountY() const;
- QSize getRangeX() const;
- QSize getRangeY() const;
- int getPadding() const;
- bool getAxis2Visible() const;
- bool getPercentY() const;
- QSize sizeHint() const;
- QSize minimumSizeHint() const;
- QCustomPlot* getPlot() const;
- public Q_SLOTS:
- void setText(const QString& title);
- //设置颜色集合
- void setColorNames(const QString& colorNames);
- //设置背景颜色+文字颜色
- void setBgColor(const QColor& bgColor);
- void setTextColor(const QColor& textColor);
- //设置网格宽度+网格颜色
- void setGridWidth(int gridWidth);
- void setGridColor(const QColor& gridColor);
- //设置十字线宽度+颜色
- void setLineWidth(int lineWidth);
- void setLineColor(const QColor& lineColor);
- //设置是否显示横线竖线
- void setShowLineh(bool showLineh);
- void setShowLinev(bool showLinev);
- //设置字体大小+数据点宽度
- void setFontSize(int fontSize);
- void setPointSize(int pointSize);
- //设置X轴偏移值+Y轴偏移值
- void setOffsetX(double offsetX);
- void setOffsetY(double offsetY);
- //设置提示信息位置 0 1 2 3 4 5 6 7 8 依次表示为 自动处理+顶部+右上角+右侧+右下角+底部+左下角+左侧+左上角
- void setToolTipPosition(int toolTipPosition);
- //设置交互模式-鼠标拖动滚轮缩放等 1.仅拖动 2.仅缩放 3.可拖动缩放
- void setInteractions(int interactions);
- void setDrawingMode(int nMode);
- void setTickCountX(int nTickCount);
- void setTickCountY(int nTickCount);
-
- void setRangeX(QSize RangeX);
- void setRangeY(QSize RangeY);
- //设置坐标轴边距
- void setPadding(int padding);
- //设置第二坐标轴可见
- void setAxis2Visible(bool axis2Visible);
- //设置Y轴可见
- void setPercentY(bool percentY);
- //设置图例可见+位置+行数
- void setLegend(bool visible, int position = 0, int column = 1);
- //设置画布隐藏
- void setVisible(int index, bool visible);
- //初始化曲线
- void init();
- //初始化图层用于绘制十字线游标
- void initTracer();
- //初始化指示器用于高亮数据点+提示数据点信息
- void initItem();
- //清空数据+清空曲线+重绘
- void clearData(int index);
- void clear(bool clearGraphs = true, bool clearItems = true, bool clearPlottables = true);
- void replot(QCustomPlot::RefreshPriority refreshPriority = QCustomPlot::rpRefreshHint);
- //绘制十字线游标
- void drawFlowLine();
- //绘制静态线条
- void drawStaticLinev(double x, double y, const QColor& color = Qt::red, int width = 2);
- void drawStaticLineh(double x, double y, const QColor& color = Qt::red, int width = 1);
- //
- QColor getRandColor();
- void initUI(QString strXName = "X", QString strYName = "Y");
- //添加画布
- void addGraph(int count);
- void addGraph(QString strName, QColor color = qRgb(255, 0, 0), int nLinsWidth = 1, bool bFull = false);
- void delGraph(QString strName);
- void addValve(QString strName, double fKey, double fValue);
- void addValve(int nPlot, double fValue);
- //设置X轴范围+Y轴范围
- void setRangeX(double min, double max, int tickCount = 6);
- void setRangeY(double min, double max, int tickCount = 6, bool percentY = false);
- //设置标签文本
- void setLabX(const vdouble& key, const vstring& lab);
- void setLabY(const vdouble& key, const vstring& lab);
- //添加折线曲线
- void addDataLine(const LineData& data);
- //设置曲线数据
- void setDataLine(const LineData& data);
- //初始化画布
- void initGraph(QCPGraph* graph, const LineData& data);
- private:
- QVector<QColor> m_defaultColors; // 颜色集合
- void initPropertyEx(CONTROL_PROPERTY_EX* pPropertyEx);
- // 初始化扩展属性
- void initPropertyEx();
- // 初始化一个扩展属性组
- void initSubGroup(PROPERTY_EX_SUBGROUP& subGroup, int nIndex, int nSubGroupID);
- // 设置曲线数
- void setCustomPlotCount(const int& count);
- // 设置曲线文字
- void updateCustomPlotTitle(const QString& newValue, const int nIndex);
- // 设置曲线颜色
- void updateCustomPlotColor(QColor newValue, const int nIndex);
- // 更新曲线线宽
- void updateLineWidth(const int lineWidth, const int nIndex);
- // 更新块属性数量(虚函数)
- virtual void updateExPropertyCount(const int fixCount, const QString& strPropName);
- // 修改扩展属性(虚函数)
- virtual void changeExProperties(QString strValueTitle, const QVariant& newValue);
- public:
- // 获取当前曲线数
- int getCustomPlotCount();
- // 设置曲线数值
- void updateCustomPlotValue(const int& newValue, const int nIndex);
- };
- #endif // CUSTOMPLOT_H
|