Qt使用ChartDirector插件制作图表

    最近做的一个项目需要在界面上画出多个图表对数据进行分析,经过同事的推荐,我使用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进行设置,然后就能够得到我们想要的图表了。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值