![594ccb5c20e3c2e207a933bddb5a3d33.gif](https://img-blog.csdnimg.cn/img_convert/594ccb5c20e3c2e207a933bddb5a3d33.gif)
一、前言
上次在写大屏数据可视化电子看板系统时候,提到过改造QCustomPlot来实现柱状分组图、横向柱状图、横向分组图、鼠标悬停提示等。这次单独列出来描述,有很多人疑问为啥不用QChart,或者echart等形式,其实这两种方式我都尝试过,比如Qt5.7以后新增的QChart模块,曲线这块,支持数据量很小,而且用法极其不适应,非常别扭,尤其是10W以上数据量的支持,简直是渣渣,优点也是有很多的,比如动画效果,我看过他的完整源码,动画这块处理的非常好,连坐标轴都可以有动画效果,而且支持很多种效果,而且内置了很多套theme皮肤,省去了很多渣渣审美的程序员自己来配色,这个倒是挺方便的。而对于echart,必须依赖浏览器控件,资源占用比较高,后面决定采用改造QCustomPlot来实现用户需要的各种图表效果。
在整个改造的过程中,全部封装成易用的函数,传入参数即可,同时还支持全局样式更改,支持样式表控制整体颜色更改,考虑了很多细节,比如弹出悬停信息的位置等,都自动计算显示在最佳最合理位置。考虑到很多人用的QCustomPlot1.0,特意还做了QCustomPlot1.0和2.0的完全兼容。
二、实现的功能
* 1:可设置X轴Y轴范围值
* 2:可设置背景颜色+文本颜色+网格颜色
* 3:可设置三条曲线颜色+颜色集合
* 4:可设置是否显示定位十字线,可分别设置横向和纵向
* 5:可设置十字线的宽度和颜色
* 6:可设置是否显示数据点以及数据点的大小
* 7:可设置是否填充背景形成面积图
* 8:可设置模式-拖动+缩放等
* 9:可设置坐标轴间距+第二坐标系可见
* 10:提供接口setDataLine直接设置曲线,支持多条
* 11:提供接口setDataBar直接设置柱状图,支持多条形成堆积图
* 12:提供接口setLabs设置文本标签替代key
* 13:提供清空+重绘接口+外部获取QCustomPlot对象
* 14:提供函数start+stop来模拟正弦曲线
* 15:可设置柱状图的值的位置+精确度+颜色
* 16:支持鼠标移动到数据点高亮显示数据点以及显示数据提示信息
* 17:可设置提示信息位置 自动处理+顶部+右上角+右侧+右下角+底部+左下角+左侧+左上角
* 18:可设置是否校验数据产生不同的背景颜色,比如柱状图的每根柱子都可以根据数据生成不同背景颜色
* 19:可设置是否显示图例+图例位置+图例行数
* 20:支持多条曲线+柱状图+柱状分组图+横向柱状图+横向柱状分组图+柱状堆积图
* 21:内置15套精美颜色,自动取颜色集合的颜色,省去配色的烦恼
* 22:同时支持 QCustomPlot 1.0 和 QCustomPlot 2.0
三、效果图
![814f00ee5daebf37ed6da5a9fc950d51.gif](https://img-blog.csdnimg.cn/img_convert/814f00ee5daebf37ed6da5a9fc950d51.gif)
![5bc9a50a4f8c1b0c2cfeb8951cfb1f27.gif](https://img-blog.csdnimg.cn/img_convert/5bc9a50a4f8c1b0c2cfeb8951cfb1f27.gif)
四、核心代码
void CustomPlot::setDataLine(int index, const QString &name, const QVector<double> &key, const QVector<double> &value)
{
if (customPlot->graphCount() > index) {
customPlot->graph(index)->setName(name);
customPlot->graph(index)->setData(key, value);
customPlot->xAxis->setRange(-offsetX, key.count() + offsetX, Qt::AlignLeft);
//超过3条线条颜色设置颜色集合的颜色
if (index >= 3) {
setColor(index, colors.at(index));
} else {
setColor(0, colors.at(0));
setColor(1, colors.at(1));
setColor(2, colors.at(2));
}
}
}
void CustomPlot::setDataBarv(const QStringList &rowNames,
const QStringList &columnNames,
const QList<QVector<double> > &values,
const QColor &borderColo