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倍之间。
如果还有不明白的,可以私聊。上线看到会回。