VCustomPlot.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. #ifndef CUSTOMPLOT_H
  2. #define CUSTOMPLOT_H
  3. /**
  4. * QCustomPlot控件封装
  5. * 1. 可设置X轴Y轴范围值
  6. * 2. 可设置背景颜色+文本颜色+网格颜色
  7. * 3. 可设置三条曲线颜色+颜色集合
  8. * 4. 可设置是否显示定位十字线,可分别设置横向和纵向
  9. * 5. 可设置十字线的宽度和颜色
  10. * 6. 可设置是否显示数据点以及数据点的大小
  11. * 7. 可设置是否填充背景形成面积图
  12. * 8. 可设置模式-拖动+缩放等
  13. * 9. 可设置坐标轴间距+第二坐标系可见
  14. * 10. 提供接口setDataLine直接设置曲线,支持多条
  15. * 11. 提供接口setDataBar直接设置柱状图,支持多条形成堆积图
  16. * 12. 提供接口setLabs设置文本标签替代key,包括X轴和Y轴
  17. * 13. 提供清空数据+重绘图表+外部获取QCustomPlot对象,这样就可以进行更加详细的参数设置
  18. * 14. 提供函数start+stop来模拟正弦曲线
  19. * 15. 可设置柱状图的值的位置+精确度+颜色
  20. * 16. 支持鼠标移动到数据点高亮显示数据点以及显示数据提示信息
  21. * 17. 可设置提示信息位置 自动处理+顶部+右上角+右侧+右下角+底部+左下角+左侧+左上角
  22. * 18. 可设置是否校验数据产生不同的背景颜色,比如柱状图的每根柱子都可以根据数据生成不同背景颜色
  23. * 19. 可设置是否显示图例+图例位置+图例行数以及图例单行显示
  24. * 20. 支持多条曲线+柱状图+柱状分组图+横向柱状图+横向分组图+柱状堆积图
  25. * 21. 内置15套精美颜色,自动取颜色集合的颜色,省去配色的烦恼
  26. * 22. 每条柱状图都可以设置不同的颜色,分组柱状图可以设置颜色交替
  27. * 23. Y轴数值支持百分比显示,可拓展成其他格式
  28. * 24. 内置平滑曲线算法,支持平滑曲线绘制,传入点集合即可
  29. * 25. 同时支持 QCustomPlot 1.0 和 QCustomPlot 2.0
  30. * 26. 支持Qt4-Qt5任意Qt版本,支持任意编译器+任意操作系统
  31. */
  32. #include "QCustomPlot/CustomPlotHelper.h"
  33. #include "QCustomPlot/CustomplotTracer.h"
  34. #include "Common.h"
  35. #include "VControlObject.h"
  36. // 扩展属性的组名
  37. #define CUSTOM_PLOT_PROPERTY_EX_NAME "曲线图"
  38. #define CUSTOM_PLOT_PROPERTY_EX_REFRESHLINK_NAME "索引链接"
  39. #define CUSTOM_PLOT_PROPERTY_EX_GROUP_NAME "曲线信息"
  40. #define CUSTOM_PLOT_PROPERTY_EX_SUBGROUP_NAME "曲线"
  41. #define CUSTOM_PLOT_PROPERTY_EX_VALUE_NAME "线名"
  42. #define CUSTOM_PLOT_PROPERTY_EX_COLOR_NAME "曲线颜色"
  43. #define CUSTOM_PLOT_PROPERTY_EX_LINEWIDTH_NAME "曲线线宽"
  44. #define CUSTOM_PLOT_PROPERTY_EX_LINK_NAME "数据链接"
  45. // 默认数值
  46. #define CUSTOM_PLOT_DEFAULT_LINEWIDTH 1
  47. // 曲线数的属性名称
  48. #define CUSTOM_PLOT_COUNT_NAME "lineCount"
  49. // 属性子分组编号(Pie目前只有一个扩展属性组)
  50. #define GROUP_INDEX_CUSTOM_PLOT 0
  51. /// <summary>
  52. /// 自定义曲线图控件
  53. /// </summary>
  54. class VCustomPlot : public QWidget, public VControlObject
  55. {
  56. Q_OBJECT
  57. Q_PROPERTY(QRect geometry READ geometry WRITE setGeometry)
  58. Q_PROPERTY(QString title READ getText WRITE setText)
  59. Q_PROPERTY(int lineCount READ getCustomPlotCount WRITE setCustomPlotCount)
  60. Q_PROPERTY(QColor bgColor READ getBgColor WRITE setBgColor)
  61. Q_PROPERTY(int interactions READ getInteractions WRITE setInteractions)// 交互模式
  62. Q_PROPERTY(int drawingMode READ getDrawingMode WRITE setDrawingMode)// 绘图模式
  63. Q_PROPERTY(QSize rangeX READ getRangeX WRITE setRangeX)// 表格范围
  64. Q_PROPERTY(int tickCountX READ getTickCountX WRITE setTickCountX)// X轴格子数量
  65. Q_PROPERTY(QSize rangeY READ getRangeY WRITE setRangeY)// 表格范围
  66. Q_PROPERTY(int tickCountY READ getTickCountY WRITE setTickCountY)// Y轴格子数量
  67. public:
  68. VCustomPlot(
  69. QWidget* parent,
  70. const QPoint& pos,
  71. const QSize& size,
  72. CONTROL_PROPERTY* pProperty = nullptr,
  73. CONTROL_PROPERTY_EX* pPropertyEx = nullptr
  74. );
  75. protected:
  76. void showEvent(QShowEvent*);
  77. void resizeEvent(QResizeEvent*);
  78. private:
  79. QString colorNames; //颜色名称集合
  80. lcolor colors; //颜色集合
  81. int gridWidth; //网格宽度
  82. QColor gridColor; //网格颜色
  83. int lineWidth; //十字线宽度
  84. QColor lineColor; //十字线颜色
  85. bool showLineh; //显示横线
  86. bool showLinev; //显示竖线
  87. int fontSize; //字体大小
  88. int pointSize; //数据点大小
  89. double offsetX; //X轴范围偏移
  90. double offsetY; //Y轴范围偏移
  91. int toolTipPosition; //提示信息位置
  92. int interactions; //交互模式-鼠标拖动滚轮缩放等
  93. int padding; //坐标轴边距
  94. bool axis2Visible; //第二坐标轴可见
  95. bool percentY; //Y轴百分比显示
  96. bool isLoad; //是否加载过
  97. QList<QCPBars*> bars; //存储柱状图集合
  98. QCustomPlot* customPlot; //曲线图表对象
  99. QCPScatterStyle scatterStyle; //曲线数据样式
  100. CustomPlotTracer* layerable; //游标层
  101. QCPItemTracer* tracer; //数据点指示器
  102. QCPItemText* textTip; //提示信息
  103. QCPBars* staticBarv; //静态柱状图
  104. private slots:
  105. //响应鼠标移动
  106. void mouseMove(QMouseEvent* event);
  107. //计算提示信息位置
  108. void checkToolTip(double& x, double& y);
  109. public:
  110. lcolor getColors() const;
  111. QString getColorNames() const;
  112. QColor getBgColor() const;
  113. QColor getTextColor() const;
  114. int getGridWidth() const;
  115. QColor getGridColor() const;
  116. int getLineWidth() const;
  117. QColor getLineColor() const;
  118. bool getShowLineh() const;
  119. bool getShowLinev() const;
  120. int getFontSize() const;
  121. int getPointSize() const;
  122. double getOffsetX() const;
  123. double getOffsetY() const;
  124. int getToolTipPosition() const;
  125. int getInteractions() const;
  126. int getDrawingMode() const;
  127. int getTickCountX() const;
  128. int getTickCountY() const;
  129. QSize getRangeX() const;
  130. QSize getRangeY() const;
  131. int getPadding() const;
  132. bool getAxis2Visible() const;
  133. bool getPercentY() const;
  134. QSize sizeHint() const;
  135. QSize minimumSizeHint() const;
  136. QCustomPlot* getPlot() const;
  137. public Q_SLOTS:
  138. void setText(const QString& title);
  139. //设置颜色集合
  140. void setColorNames(const QString& colorNames);
  141. //设置背景颜色+文字颜色
  142. void setBgColor(const QColor& bgColor);
  143. void setTextColor(const QColor& textColor);
  144. //设置网格宽度+网格颜色
  145. void setGridWidth(int gridWidth);
  146. void setGridColor(const QColor& gridColor);
  147. //设置十字线宽度+颜色
  148. void setLineWidth(int lineWidth);
  149. void setLineColor(const QColor& lineColor);
  150. //设置是否显示横线竖线
  151. void setShowLineh(bool showLineh);
  152. void setShowLinev(bool showLinev);
  153. //设置字体大小+数据点宽度
  154. void setFontSize(int fontSize);
  155. void setPointSize(int pointSize);
  156. //设置X轴偏移值+Y轴偏移值
  157. void setOffsetX(double offsetX);
  158. void setOffsetY(double offsetY);
  159. //设置提示信息位置 0 1 2 3 4 5 6 7 8 依次表示为 自动处理+顶部+右上角+右侧+右下角+底部+左下角+左侧+左上角
  160. void setToolTipPosition(int toolTipPosition);
  161. //设置交互模式-鼠标拖动滚轮缩放等 1.仅拖动 2.仅缩放 3.可拖动缩放
  162. void setInteractions(int interactions);
  163. void setDrawingMode(int nMode);
  164. void setTickCountX(int nTickCount);
  165. void setTickCountY(int nTickCount);
  166. void setRangeX(QSize RangeX);
  167. void setRangeY(QSize RangeY);
  168. //设置坐标轴边距
  169. void setPadding(int padding);
  170. //设置第二坐标轴可见
  171. void setAxis2Visible(bool axis2Visible);
  172. //设置Y轴可见
  173. void setPercentY(bool percentY);
  174. //设置图例可见+位置+行数
  175. void setLegend(bool visible, int position = 0, int column = 1);
  176. //设置画布隐藏
  177. void setVisible(int index, bool visible);
  178. //初始化曲线
  179. void init();
  180. //初始化图层用于绘制十字线游标
  181. void initTracer();
  182. //初始化指示器用于高亮数据点+提示数据点信息
  183. void initItem();
  184. //清空数据+清空曲线+重绘
  185. void clearData(int index);
  186. void clear(bool clearGraphs = true, bool clearItems = true, bool clearPlottables = true);
  187. void replot(QCustomPlot::RefreshPriority refreshPriority = QCustomPlot::rpRefreshHint);
  188. //绘制十字线游标
  189. void drawFlowLine();
  190. //绘制静态线条
  191. void drawStaticLinev(double x, double y, const QColor& color = Qt::red, int width = 2);
  192. void drawStaticLineh(double x, double y, const QColor& color = Qt::red, int width = 1);
  193. //
  194. QColor getRandColor();
  195. void initUI(QString strXName = "X", QString strYName = "Y");
  196. //添加画布
  197. void addGraph(int count);
  198. void addGraph(QString strName, QColor color = qRgb(255, 0, 0), int nLinsWidth = 1, bool bFull = false);
  199. void delGraph(QString strName);
  200. void addValve(QString strName, double fKey, double fValue);
  201. void addValve(int nPlot, double fValue);
  202. //设置X轴范围+Y轴范围
  203. void setRangeX(double min, double max, int tickCount = 6);
  204. void setRangeY(double min, double max, int tickCount = 6, bool percentY = false);
  205. //设置标签文本
  206. void setLabX(const vdouble& key, const vstring& lab);
  207. void setLabY(const vdouble& key, const vstring& lab);
  208. //添加折线曲线
  209. void addDataLine(const LineData& data);
  210. //设置曲线数据
  211. void setDataLine(const LineData& data);
  212. //初始化画布
  213. void initGraph(QCPGraph* graph, const LineData& data);
  214. private:
  215. QVector<QColor> m_defaultColors; // 颜色集合
  216. void initPropertyEx(CONTROL_PROPERTY_EX* pPropertyEx);
  217. // 初始化扩展属性
  218. void initPropertyEx();
  219. // 初始化一个扩展属性组
  220. void initSubGroup(PROPERTY_EX_SUBGROUP& subGroup, int nIndex, int nSubGroupID);
  221. // 设置曲线数
  222. void setCustomPlotCount(const int& count);
  223. // 设置曲线文字
  224. void updateCustomPlotTitle(const QString& newValue, const int nIndex);
  225. // 设置曲线颜色
  226. void updateCustomPlotColor(QColor newValue, const int nIndex);
  227. // 更新曲线线宽
  228. void updateLineWidth(const int lineWidth, const int nIndex);
  229. // 更新块属性数量(虚函数)
  230. virtual void updateExPropertyCount(const int fixCount, const QString& strPropName);
  231. // 修改扩展属性(虚函数)
  232. virtual void changeExProperties(QString strValueTitle, const QVariant& newValue);
  233. public:
  234. // 获取当前曲线数
  235. int getCustomPlotCount();
  236. // 设置曲线数值
  237. void updateCustomPlotValue(const int& newValue, const int nIndex);
  238. };
  239. #endif // CUSTOMPLOT_H