文件格式为一行一个采集日期,后面跟着n列不同通道的温度数据:
读取和解析CSV文件数据
// 文件中的每行数据被分解为一个日期字段和多个温度字段。
QVector<QDateTime> timeValues;
QVector<QVector<double>> temperatureValues;
QStringList legendLabels;
QFile file("D://zhice//day03//MEAS.csv");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
qDebug() << "Failed to open file";
}
QTextStream in(&file);
// 读取第一行标题行
QString line = in.readLine();
QStringList fields = line.split(",");
for (int i = 1; i < fields.size(); ++i)
{
legendLabels.append(fields.at(i));
}
while (!in.atEnd())
{
QString line = in.readLine();
QStringList fields = line.split(",");
// 读取采集时间和温度数据
QDateTime time = QDateTime::fromString(fields.at(0), "yyyy-M-d hh:mm");
timeValues.append(time);
QVector<double> temperatures;
for (int i = 1; i < fields.size(); ++i)
{
double temperature = fields.at(i).toDouble();
temperatures.append(temperature);
}
temperatureValues.append(temperatures);
}
file.close();
QVector<QDateTime>::iterator iter1;
for (iter1=timeValues.begin();iter1!=timeValues.end();iter1++) {
QDateTime timeValues = *iter1;
// 使用 dateTime 进行操作
qDebug() << timeValues.toString("yyyy-MM-dd hh:mm");
}
QVector<QVector<double>>::iterator iter2;
for (iter2=temperatureValues.begin();iter2!=temperatureValues.end();iter2++) {
qDebug() << *iter2 << "\0";
}
创建一个QChart
对象和一个QChartView
对象
// 这两个对象分别表示图表本身和图表的可视化视图
QChart *chart = new QChart();
QChartView *chartView = new QChartView(chart);
chartView->setRenderHint(QPainter::Antialiasing);
将读取到的每个通道的温度数据添加到图表中
// 每个通道的温度数据都被添加到一个`QLineSeries`对象中,然后将该对象添加到图表中
for (int i = 0; i < temperatureValues.at(0).size(); ++i)
{
QLineSeries *series = new QLineSeries();
for (int j = 0; j < timeValues.size(); ++j)
{
series->append(timeValues.at(j).toMSecsSinceEpoch(),
temperatureValues.at(j).at(i));
}
chart->addSeries(series);
// 设置颜色系列名称和颜色
series->setName(legendLabels.at(i));
series->setColor(QColor::fromHsl(i * 30, 255, 128));
}
设置坐标轴和标题
// `x`轴使用`QDateTimeAxis`对象,轴的范围和标签格式也同样被设定
// `y`轴使用`QValueAxis`对象,并设定其范围
// 创建时间轴对象
QDateTimeAxis *axisX = new QDateTimeAxis;
axisX->setTickCount(10);
// 设置时间轴范围
axisX->setRange(timeValues.first(), timeValues.last());
// 设置时间轴标签格式
axisX->setFormat("yyyy-MM-dd hh:mm");
// 将时间轴添加到图表中
chart->addAxis(axisX, Qt::AlignBottom);
QValueAxis *axisY = new QValueAxis;
axisY->setTickCount(10);
axisY->setRange(26, 30);
chart->addAxis(axisY, Qt::AlignLeft);
foreach (QAbstractSeries *series, chart->series())
{
series->attachAxis(axisX);
series->attachAxis(axisY);
}
chart->setTitle("Temperature Chart");
chart->legend()->setVisible(true); // 显示图例
chart->legend()->setAlignment(Qt::AlignRight); // 设置图例对齐方式
chart->legend()->setMarkerShape(QLegend::MarkerShapeRectangle); // 根据系列设置图例图标形状
在QGraphicsView
控件上显示图表
// 设置图表的一些属性,如标题和是否显示图例等
ui->graphicsView->setChart(chart); //ui中已添加的QChartView
ui->graphicsView->setRenderHint(QPainter::Antialiasing);
ui->graphicsView->setVisible(true);
图表的结果是一个以时间为
x
轴,以温度为y
轴的图表,每个通道的数据都以不同的颜色显示。
运行效果图:(横轴为时间,纵轴为温度)
Photo by Meow on Coverview