【QT】 使用QChart从CSV文件创建温度图表

读取CSV文件中的温度数据,并使用Qt的QChart库创建一个温度图。

文件格式为一行一个采集日期,后面跟着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轴的图表,每个通道的数据都以不同的颜色显示。

运行效果图:(横轴为时间,纵轴为温度)

csvToImg2

Photo by Meow on Coverview

使用 Hugo 构建
主题 StackJimmy 设计