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<SHisInfo> 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<SHisInfo> 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<double, QCPData>::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<value_min1)
		{
			value_min1 = value;
		}
	}

	QMap<double, QCPData>::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 (value<value_min2)
		{
			value_min2 = value;
		}
	}

	if (value_max1>value_max2)
	{
		value_max = value_max1;
	}
	else
	{
		value_max = value_max2;
	}

	if (value_min1<value_min2)
	{
		value_min = value_min1;
	}
	else
	{
		value_min = value_min2;
	}
	m_frm->curve_page_grid_load->yAxis->setRange(0.8*value_min, 1.2*value_max);

效果图:

 

 

 

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

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

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Link-Riley曲线是一种常用于滤波器设计中的图形,可以使用QCustomPlot库在QT中绘制。以下是绘制Link-Riley曲线的步骤: 1. 在QT中创建一个QWidget或QMainWindow窗口,并在该窗口中添加QCustomPlot小部件。 2. 将以下代码添加到QWidget或QMainWindow的槽函数中,以绘制Link-Riley曲线: ``` QCustomPlot *customPlot = ui->customPlot; // 获取QCustomPlot小部件的指针 customPlot->addGraph(); // 添加一个图形 customPlot->graph(0)->setPen(QPen(Qt::blue)); // 设置曲线的颜色 customPlot->graph(0)->setName("Link-Riley Curve"); // 设置曲线的名称 QVector<double> x(101), y(101); // 设置x和y向量 for (int i=0; i<101; i++) { double f = i/50.0; // 设置频率 double w = 2*M_PI*f; // 计算角频率 double a = 1/(1 + 0.414*pow(w, -1.0/2) + 0.707*pow(w, -1.0)); // 计算幅度响应 double phi = -atan(0.414*pow(w, -1.0/2) + 0.707*pow(w, -1.0)); // 计算相位响应 x[i] = f; // 设置x值 y[i] = 20*log10(a); // 计算dB值 } customPlot->graph(0)->setData(x, y); // 设置曲线的数据 customPlot->xAxis->setLabel("Frequency (Hz)"); // 设置x轴标签 customPlot->yAxis->setLabel("Magnitude (dB)"); // 设置y轴标签 customPlot->rescaleAxes(); // 自动缩放坐标轴 customPlot->replot(); // 绘制曲线 ``` 这段代码将在QCustomPlot小部件中添加一个蓝色的Link-Riley曲线。在这里,我们使用了Link-Riley滤波器的幅度响应和相位响应计算公式来计算曲线的值。在这里,我们使用了dB值来表示曲线的幅度。 3. 运行QT程序,即可看到绘制的Link-Riley曲线。可以使用QCustomPlot库的其他函数来更改曲线的样式、添加标签、设置坐标轴等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值