PowerMaster/dataPanel/dpLineChart.cpp

179 lines
6.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "dpLineChart.h"
#include "util/Chart/qcustomplot.h"
dpLineChart::dpLineChart(QWidget* parent)
:dpBaseChart(parent)
{
setAttribute(Qt::WA_TranslucentBackground,true);
m_pCustomPlot = new QCustomPlot(this);
initQCP();
m_timeRange = 60 * 1000;
QBoxLayout* mainLayout = new QBoxLayout(QBoxLayout::LeftToRight);
mainLayout->setContentsMargins(0, 1, 0, 0);
mainLayout->addWidget(m_pCustomPlot);
setLayout(mainLayout);
}
dpLineChart::~dpLineChart()
{
}
void dpLineChart::initQCP()
{
m_chartStyle.bgColor = Qt::transparent;
m_chartStyle.axisColor = QColor(87, 100, 120);
m_chartStyle.tickColor = QColor(87, 100, 120);
m_chartStyle.tickLabelColor = QColor(250, 250, 250);
m_chartStyle.tickLabelFont = QFont("黑体", 12);
m_chartStyle.gridPen = QPen(QColor(87, 100, 120), 1, Qt::DotLine);
//m_pCustomPlot->axisRect()->setupFullAxesBox();
m_pCustomPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
m_pCustomPlot->axisRect()->setRangeDrag(Qt::Horizontal); //只允许x轴方向的拖拽
double zoomFactor = m_pCustomPlot->axisRect()->rangeZoomFactor(Qt::Horizontal);
m_pCustomPlot->axisRect()->setRangeZoomFactor(zoomFactor, 1); //只做x轴的缩放
m_pCustomPlot->xAxis->setSubTicks(false);
m_pCustomPlot->xAxis2->setTicks(false);
m_pCustomPlot->xAxis2->setSubTicks(false);
m_pCustomPlot->yAxis->setSubTicks(false);
//m_pCustomPlot->yAxis2->setTicks(false);
m_pCustomPlot->yAxis2->setSubTicks(false);
m_pCustomPlot->yAxis2->setVisible(true);
connect(m_pCustomPlot->xAxis, qOverload<const QCPRange &>(&QCPAxis::rangeChanged), //rangeChanged有两个版本qOverload可以指定版本
this, &dpLineChart::onSignal_rangeChanged_xAxis);
//背景颜色
m_pCustomPlot->setBackground(QBrush(m_chartStyle.bgColor));
//坐标轴颜色
m_pCustomPlot->xAxis->setBasePen(m_chartStyle.axisColor);
m_pCustomPlot->xAxis2->setBasePen(m_chartStyle.axisColor);
m_pCustomPlot->yAxis->setBasePen(m_chartStyle.axisColor);
m_pCustomPlot->yAxis2->setBasePen(m_chartStyle.axisColor);
//坐标刻度颜色
m_pCustomPlot->xAxis->setTickPen(QPen(m_chartStyle.tickColor));
m_pCustomPlot->yAxis->setTickPen(QPen(m_chartStyle.tickColor));
m_pCustomPlot->yAxis2->setTickPen(QPen(m_chartStyle.tickColor));
//坐标刻度Label颜色
m_pCustomPlot->xAxis->setTickLabelColor(m_chartStyle.tickLabelColor);
m_pCustomPlot->xAxis->setTickLabelFont(m_chartStyle.tickLabelFont);
m_pCustomPlot->yAxis->setTickLabelColor(m_chartStyle.tickLabelColor);
m_pCustomPlot->yAxis->setTickLabelFont(m_chartStyle.tickLabelFont);
m_pCustomPlot->yAxis2->setTickLabelColor(m_chartStyle.tickLabelColor);
m_pCustomPlot->yAxis2->setTickLabelFont(m_chartStyle.tickLabelFont);
//网格线颜色
m_pCustomPlot->xAxis->grid()->setPen(m_chartStyle.gridPen);
m_pCustomPlot->xAxis->grid()->setZeroLinePen(m_chartStyle.gridPen);
//m_pCustomPlot->xAxis2->grid()->setPen(m_chartStyle.gridPen);
m_pCustomPlot->yAxis->grid()->setPen(m_chartStyle.gridPen);
m_pCustomPlot->yAxis->grid()->setZeroLinePen(m_chartStyle.gridPen);
m_pCustomPlot->yAxis2->grid()->setPen(m_chartStyle.gridPen);
//x轴用时间格式
QSharedPointer<QCPAxisTickerDateTime> timeTicker(new QCPAxisTickerDateTime);
timeTicker->setDateTimeFormat("hh:mm:ss:zzz\nyyyy/MM/dd");
//qDebug() << timeTicker->dateTimeFormat();
m_pCustomPlot->xAxis->setTicker(timeTicker);
//qDebug() << m_pCustomPlot->xAxis->range();
}
void dpLineChart::setTimeRange(TimeUnit unit)
{
switch(unit)
{
case TU_Year:
m_timeRange = m_curDateTime.date().daysInYear() * 24 * 60 * 60 * (qint64)1000;
break;
case TU_Month:
m_timeRange = m_curDateTime.date().daysInMonth() * 24 * 60 * 60 * (qint64)1000;
break;
case TU_Day:
m_timeRange = 24 * 60 * 60 * 1000;
break;
case TU_Hour:
m_timeRange = 60 * 60 *1000;
break;
case TU_Minute_30:
m_timeRange = 30 * 60 *1000;
break;
case TU_Minute_20:
m_timeRange = 20 * 60 *1000;
break;
case TU_Minute_15:
m_timeRange = 15 * 60 *1000;
break;
case TU_Minute_10:
m_timeRange = 10 * 60 *1000;
break;
case TU_Minute_5:
m_timeRange = 5 * 60 *1000;
break;
case TU_Minute_3:
m_timeRange = 3 * 60 *1000;
break;
case TU_Minute_1:
m_timeRange = 60 * 1000;
break;
case TU_Second_30:
m_timeRange = 30 * 1000;
break;
case TU_Second_10:
m_timeRange = 10 * 1000;
break;
case TU_Second_1:
m_timeRange = 1 * 1000;
break;
case TU_MSecond_500:
m_timeRange = 500;
break;
case TU_MSecond_100:
m_timeRange = 100;
break;
case TU_MSecond_50:
m_timeRange = 50;
break;
case TU_MSecond_10:
m_timeRange = 10;
break;
default:
break;
}
}
void dpLineChart::setDateTime(const QDateTime& dateTime)
{
qint64 timeValue = dateTime.toMSecsSinceEpoch() / 1000.0;
//qint64 timeValue = QCPAxisTickerDateTime::dateTimeToKey(dateTime);
m_pCustomPlot->xAxis->setRange(timeValue, m_timeRange / 1000.0, Qt::AlignRight);
m_pCustomPlot->replot();
m_curDateTime = dateTime;
}
void dpLineChart::viewHistoricalData(const QDateTime& dateTime)
{
}
void dpLineChart::synchronizeConfigData(const configurationResults& cfg)
{
//Y坐标轴的数量由数据类型决定
QHash<RealTimeDataType, Axis> cfgAxisMap; //将最新配置信息中的坐标轴相关数据存储在QHash中有助于更好的判断当前坐标轴是否需要发生同步更新
for(int i = 0; i< cfg.m_pModel_dataType->rowCount(); i++)
{
Axis axis;
axis.name = cfg.axisInfo.name;
axis.unit = cfg.axisInfo.unit;
RealTimeDataType dataType = (RealTimeDataType)cfg.m_pModel_dataType->item(i, 0)->data(Qt::UserRole + itemRole_dataType).toInt();
axis.dataType = dataType;
cfgAxisMap.insert(dataType, axis);
}
}
void dpLineChart::onSignal_rangeChanged_xAxis(const QCPRange& range)
{
// qDebug() << "m_timeRange: " << m_timeRange;
// qDebug() << "range size: " << range.size();
if(m_timeRange != range.size() * 1000)
m_timeRange = range.size() * 1000;
}