栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

QCustomPlot实战使用二:实时曲线高级使用

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

QCustomPlot实战使用二:实时曲线高级使用

1、初始化固定x轴为当日时间(24小时),并读取数据库存储的当日截至目前时刻的历史数据形成曲线

void CAlrHmi::init_page1_curve1()
{
	m_frm->curve_page_grid_load->addGraph();
	m_frm->curve_page_grid_load->addGraph();

	m_frm->curve_page_grid_load->graph(0)->setPen(QPen(Qt::darkRed));
	m_frm->curve_page_grid_load->graph(0)->setName(tr("实时负荷(MW)"));
	m_frm->curve_page_grid_load->graph(0)->rescaleValueAxis(true, true);
	m_frm->curve_page_grid_load->graph(0)->rescaleAxes();

	m_frm->curve_page_grid_load->graph(1)->setPen(QPen(Qt::darkGreen));
	m_frm->curve_page_grid_load->graph(1)->setName(tr("计划负荷(MW)"));
	m_frm->curve_page_grid_load->graph(1)->rescaleValueAxis(true, true);
	m_frm->curve_page_grid_load->graph(1)->rescaleAxes();

	m_frm->curve_page_grid_load->xAxis->setTickLabelType(QCPAxis::ltDateTime);
	m_frm->curve_page_grid_load->xAxis->setDateTimeFormat("MM-dd hh:mm");
	m_frm->curve_page_grid_load->xAxis->setAutoTickStep(false);
	m_frm->curve_page_grid_load->xAxis->setTickStep(7200);        //单刻度时间跨度

	m_frm->curve_page_grid_load->axisRect()->setupFullAxesBox();

	QString nowday_str = QDateTime::currentDateTime().toString("yyyy-MM-dd 00:00:00");   //获取当前0点时间
	double start_dt = QDateTime::fromString(nowday_str, "yyyy-MM-dd hh:mm:ss").toMSecsSinceEpoch() / 1000.0;    //将当日时间0点转为秒级时间戳
	double end_dt = QDateTime::fromString(nowday_str, "yyyy-MM-dd hh:mm:ss").toMSecsSinceEpoch() / 1000.0 + 86400;    //时间跨度86400s
	m_frm->curve_page_grid_load->xAxis->setRange(start_dt, end_dt);    //设置X轴的范围为当日零点至24点,刻度数为86400s/7200s


	vector vec_grid_load;
	QString sql_str1 = QString("SELECt OCCUR_TIME,CUR_074 FROM "HISDB"."YC_HS_500002" WHERe OCCUR_TIME >= '%1'").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd 00:00:00"));
	log_debug("%s", sql_str1.toStdString().c_str());
	int ret = m_hisDbClient->GetBySQL(sql_str1.toStdString().c_str(), vec_grid_load);
	if (ret<0)
	{
		log_error("GET grid_load FORM yc_hs_500002 ERROR %d", ret);
	}
	vector vec_grid_plan;
	QString sql_str2 = QString("SELECt OCCUR_TIME,CUR_014 FROM "HISDB"."YC_HS_500002" WHERe OCCUR_TIME >= '%1'").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd 00:00:00"));
	log_debug("%s", sql_str2.toStdString().c_str());
	ret = m_hisDbClient->GetBySQL(sql_str2.toStdString().c_str(), vec_grid_plan);
	if (ret<0)
	{
		log_error("GET grid_plan FORM yc_hs_500002 ERROR %d", ret);
	}
	for (int i = 0; i < vec_grid_load.size(); i++)
	{
		double key = vec_grid_load[i].occur_time;
		double value = vec_grid_load[i].value;
		m_frm->curve_page_grid_load->graph(0)->addData(key, value);
	}
	for (int i = 0; i < vec_grid_plan.size(); i++)
	{
		double key = vec_grid_plan[i].occur_time;
		double value = vec_grid_plan[i].value;
		m_frm->curve_page_grid_load->graph(1)->addData(key, value);
	}
	
	m_frm->curve_page_grid_load->legend->setVisible(true);
	m_frm->curve_page_grid_load->axisRect()->insetLayout()->setInsetAlignment(0, Qt::AlignTop | Qt::AlignLeft);
};

2、自适应y轴范围

在使用的过程中发现   rescaleValueAxis(true, true)和rescaleAxes()这两个函数的显示效果达不到预期,历史的极大极小值会被略去,因此自己遍历曲线中的数据设置最大最小值

	double value_max = 0.0;
	double value_min = 9999;
	double value_max1 = 0.0;
	double value_min1 = 9999;
	double value_max2 = 0.0;
	double value_min2 = 9999;
	const QCPDataMap *map_data1 = m_frm->curve_page_grid_load->graph(0)->data();
	const QCPDataMap *map_data2 = m_frm->curve_page_grid_load->graph(1)->data();

	QMap::const_iterator iter1;
	for (iter1 = map_data1->begin(); iter1 != map_data1->end(); ++iter1)
	{
		double value = iter1.value().value;
		if (value>value_max1)
		{
			value_max1 = value;
		}
		if (value::const_iterator iter2;
	for (iter2 = map_data2->begin(); iter2 != map_data2->end(); ++iter2)
	{
		double value = iter2.value().value;
		if (value>value_max2)
		{
			value_max2 = value;
		}
		if (valuevalue_max2)
	{
		value_max = value_max1;
	}
	else
	{
		value_max = value_max2;
	}

	if (value_min1curve_page_grid_load->yAxis->setRange(0.8*value_min, 1.2*value_max);

效果图:

 

 

 

配合QTimer使用,使y轴的刻度永远为曲线内数据最小值的0.8倍——最大值的1.2倍之间。

如果还有不明白的,可以私聊。上线看到会回。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1019494.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号