#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 /// /// 自定义曲线图控件 /// 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 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 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