QT读文件中的数据绘制曲线实现历史回放功能
时间: 2024-02-18 19:01:16 浏览: 291
QT读取数据并绘制曲线
5星 · 资源好评率100%
要实现历史回放功能,需要读取存储在文件中的历史数据,然后按照时间顺序依次绘制曲线。以下是一个简单的实现步骤:
1. 创建一个Qt图形界面应用程序,并添加一个QCustomPlot控件用于绘制曲线。
2. 添加一个QPushButton控件用于触发历史回放功能,以及一个QFileDialog控件用于选择历史数据文件。
3. 在QPushButton的clicked()信号槽函数中,使用QFileDialog打开历史数据文件,并读取文件中的数据。
4. 将读取到的数据按时间顺序排序,并按照时间顺序依次绘制曲线。可以使用QTimer类来实现按时间顺序绘制曲线的功能。
5. 在绘制曲线时,可以使用QCPGraph控件来表示曲线,使用addData()函数向曲线中添加数据点。
以下是一个示例代码:
```
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QTimer>
#include <QDateTime>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 添加一个QCustomPlot控件用于绘制曲线
m_customPlot = new QCustomPlot(this);
setCentralWidget(m_customPlot);
// 添加一个QPushButton控件用于触发历史回放功能
m_playbackButton = new QPushButton("Playback", this);
connect(m_playbackButton, &QPushButton::clicked, this, &MainWindow::onPlaybackButtonClicked);
// 在工具栏中添加QPushButton控件和QFileDialog控件
QToolBar *toolBar = addToolBar("Toolbar");
toolBar->addWidget(m_playbackButton);
toolBar->addAction("Open", this, &MainWindow::onOpenFile);
// 初始化QTimer用于按时间顺序绘制曲线
m_timer = new QTimer(this);
connect(m_timer, &QTimer::timeout, this, &MainWindow::onTimerTimeout);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::onOpenFile()
{
// 使用QFileDialog打开历史数据文件
QString fileName = QFileDialog::getOpenFileName(this, "Open File", "", "Text Files (*.txt)");
if (fileName.isEmpty())
return;
// 读取文件中的数据
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly))
return;
QTextStream in(&file);
m_data.clear();
while (!in.atEnd())
{
QString line = in.readLine();
QStringList parts = line.split(',');
if (parts.size() != 2)
continue;
QDateTime dateTime = QDateTime::fromString(parts[0], "yyyy-MM-dd HH:mm:ss.zzz");
double value = parts[1].toDouble();
m_data.append(qMakePair(dateTime, value));
}
// 关闭文件
file.close();
// 按时间顺序排序
std::sort(m_data.begin(), m_data.end(), [](const QPair<QDateTime, double> &a, const QPair<QDateTime, double> &b){
return a.first < b.first;
});
}
void MainWindow::onPlaybackButtonClicked()
{
// 按时间顺序依次绘制曲线
if (m_data.isEmpty())
return;
m_customPlot->clearGraphs();
QCPGraph *graph = m_customPlot->addGraph();
double minX = std::numeric_limits<double>::max();
double maxX = std::numeric_limits<double>::min();
for (int i = 0; i < m_data.size(); i++)
{
double x = m_data[i].first.toMSecsSinceEpoch() / 1000.0;
double y = m_data[i].second;
graph->addData(x, y);
minX = qMin(minX, x);
maxX = qMax(maxX, x);
}
m_customPlot->xAxis->setRange(minX, maxX);
m_customPlot->yAxis->setRange(graph->data().valueRange().lower, graph->data().valueRange().upper);
// 启动QTimer按时间顺序绘制曲线
m_timer->start(100);
}
void MainWindow::onTimerTimeout()
{
static int index = 0;
if (index >= m_data.size())
{
m_timer->stop();
return;
}
QCPGraph *graph = m_customPlot->graph();
double x = m_data[index].first.toMSecsSinceEpoch() / 1000.0;
double y = m_data[index].second;
graph->addData(x, y);
m_customPlot->xAxis->setRange(m_customPlot->xAxis->range().lower, x);
m_customPlot->yAxis->setRange(graph->data().valueRange().lower, graph->data().valueRange().upper);
m_customPlot->replot();
index++;
}
```
该示例代码实现了一个简单的历史回放功能。在打开历史数据文件后,点击Playback按钮即可按时间顺序绘制曲线。在绘制曲线时,使用了QTimer按时间顺序依次绘制曲线。
阅读全文