最近做的一个项目需要在界面上画出多个图表对数据进行分析,经过同事的推荐,我使用ChartDirector这个插件。对于ChartDirector我就不多做介绍,不知道的直接网上百度一下即可,Qt安装和使用这个插件的过程我也不赘述了,网上一搜一大把,当然我写的这些也应该一搜一大把吧,不过正好今天没什么事,上班期间闲着也是闲着,为了满足自己的打字欲望,写一些自己的心得出来分享一下。
首先,先上一下代码吧,代码蛮简单的,大神们看得懂代码也就不需要看我后面的那些废话了。
void UpperWidget::ShowAreaChart(QString chart_name, QVector<QVector<double>> chart_data, QStringList chart_label, QWidget* show_widget)
{
chart_open_flag = true;
QChartViewer *viewer = new QChartViewer(show_widget);
char** labels = new char*[chart_label.size()];
for (int i = 0; i < chart_label.size(); i++)
{
// 解决中文乱码问题: https://bbs.125.la/thread-14028995-1-1.html
auto str = chart_label.at(i).toStdString() + "\0";
const int len = str.length();
auto char_star = new char[len + 1];
strcpy(char_star, str.c_str());
labels[i] = char_star;
}
double* data1 = new double[chart_data.at(0).size()];
for (int m = 0; m < chart_data.at(0).size(); m++)
{
data1[m] = chart_data.at(0).at(m);
}
double* data2 = new double[chart_data.at(1).size()];
for (int n = 0; n < chart_data.at(1).size(); n++)
{
data2[n] = chart_data.at(1).at(n);
}
XYChart *m_Areachart;
m_Areachart = new XYChart(show_widget->width(), show_widget->height());
m_Areachart->xAxis()->setLabelStyle("simsun.ttc", 8, 0x20000000);
m_Areachart->setDefaultFonts("simsun.ttc");
// m_Areachart->setPlotArea(40, 50, show_widget->width() - 70, show_widget->height() - 90, -1, -1,
// Chart::Transparent, 0x000000);
m_Areachart->setPlotArea(show_widget->width()*0.10, show_widget->height()*0.15,
show_widget->width()*0.66, show_widget->height()*0.75, -1, -1,
Chart::Transparent, 0x000000);
m_Areachart->setRoundedFrame(0xffffff, 20);
LegendBox* legend_box1 = m_Areachart->addLegend(show_widget->width()*0.80, show_widget->height()*0.15);
legend_box1->addKey("正样本", 0x806affee);
LegendBox* legend_box2 = m_Areachart->addLegend(show_widget->width()*0.80, show_widget->height()*0.15);
legend_box2->addKey("负样本", 0x80fdff70);
auto name_str = chart_name.toStdString() + "\0";
const int name_len = name_str.length();
auto char_name = new char[name_len + 1];
strcpy(char_name, name_str.c_str());
m_Areachart->addTitle(char_name, "simsun.ttc Bold", 12)->setMargin(0, 0, 8, 8);
AreaLayer* area1 = m_Areachart->addAreaLayer(DoubleArray(data1, chart_data.at(0).size()), 0x806affee
);
AreaLayer* area2 = m_Areachart->addAreaLayer(DoubleArray(data2, chart_data.at(1).size()), 0x80fdff70
);
area1->setBorderColor(0x08ffca);
area1->setAggregateLabelStyle("simsun.ttc", 10);
area2->setBorderColor(0xffb802);
m_Areachart->xAxis()->setLabels(StringArray(labels, chart_label.size()));
//m_Areachart->xAxis()->setLabelStep(3);
// 图表的渐变背景色
m_Areachart->setBackground(m_Areachart->linearGradientColor(0, 0, 0, m_Areachart->getHeight(), 0xaaccff, 0xffffff));
m_Areachart->setRoundedFrame(0xffffffff, 0);
viewer->setChart(m_Areachart);
viewer->setImageMap(m_Areachart->getHTMLImageMap("", "", "title='{xLabel}: {value}'"));
viewer->show();
}
效果如下图所示:
以上代码时一个制作区域图的代码。首先,先在chartDirector插件的文件夹中找到include文件夹,找到chartdir.h文件,这个文件里包含这个插件需要使用的所有的表格类,简单的说这个文件就相当于Qt的帮助文档一样,我们只需要通过查询这个文档的内容然后自由组合就可以做出我们想要的效果。
然后,我们找到XYChart这个类,通过这个类可以设置表的X轴和Y轴,可以设置XY轴的大小和位置,通过获取xAxis,然后找到xAxis类设置坐标轴的标题等属性,此时需查询xAxis类。然后通过addLegend等函数添加对应的图标类型,此处使用的是AreaLegend,一个坐标轴可以添加多个legend,addLegend返回对应的legend,我们需要找到对应的类然后对这个legend进行设置,然后就能够得到我们想要的图表了。