#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