相信小伙伴们在做数据采集后,想要动态的获取点,实时的显示在图上,好看好数据,下面这个例子可以实现这个功能,大家可以对其进行相对应的更改,达到你实现的想法:
实现效果:
如果大家不想用直线,想用平滑曲线,把QLineSeries 类改成 QSplineSeries 就可以啦。
话不多说,上代码:
首先在工程项目中(.pro文件)里添加:
QT += charts
对应头文件:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtCharts>
QT_CHARTS_USE_NAMESPACE
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
void createXY();
private slots:
void on_btn_open_clicked();
void on_btn_stop_clicked();
protected:
void timerEvent(QTimerEvent *event) Q_DECL_OVERRIDE;
private:
QLineSeries * lineSeries; //记录当前的序列
QValueAxis * curAxisX; //记录当前的座标X
QValueAxis * curAxisY; //记录当前的座标Y
bool open; //开关
qreal t = 0;
int max_X =100;
int Timer ;
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
对应的cpp文件:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTime>
#include <QThread>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
createXY(); //初始化座标轴
open = true;
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::createXY()
{
//添加标题头
QChart *chart = new QChart();
chart->setTitle(tr("这是我的曲线"));
ui->viewxy->setChart(chart);
ui->viewxy->setRenderHint(QPainter::Antialiasing);
//设置
lineSeries = new QLineSeries();
lineSeries->setName(tr("获取的数据"));
QPen pen;
pen.setStyle(Qt::SolidLine);
pen.setColor(Qt::red);
pen.setWidth(2);
lineSeries->setPen(pen);
chart->addSeries(lineSeries);
curAxisX = new QValueAxis();
curAxisY = new QValueAxis();
curAxisX->setRange(0,max_X);//设置座标轴范围
curAxisX->setLabelFormat("%.2f"); //标签格式
curAxisX->setTitleText(tr("time(sec)"));
curAxisY->setRange(0,100);
curAxisY->setLabelFormat("%d"); //标签格式
curAxisY->setTitleText(tr("Value"));
chart->addAxis(curAxisX,Qt::AlignBottom);
chart->addAxis(curAxisY,Qt::AlignLeft);
lineSeries->attachAxis(curAxisX);
lineSeries->attachAxis(curAxisY);
lineSeries->setUseOpenGL(true);
}
void MainWindow::on_btn_open_clicked()
{
Timer = startTimer(10);
}
void MainWindow::on_btn_stop_clicked()
{
open = false;
lineSeries->clear();
t = 0;
killTimer(Timer);
}
void MainWindow::timerEvent(QTimerEvent *event)
{
if(event->timerId() == Timer)
{
if(t >= max_X)
{
max_X +=1; //扩大
curAxisX->setMax(max_X);
}
qreal rd;
qreal y = 0;
qsrand(QTime::currentTime().second());
rd =(qrand() % 100);
y = rd +5;
lineSeries->append(t,y);
t++;
}
}
这里的利用Qtime 获取触发事件,这里只是简单的使用,小伙伴们在实际运用中,可以使用线程来实现这个功能,相关多线程,串口通讯可以关注我的博客,在我博客都有相关部分。
一起学习与进步吧。
程序例子:
链接:https://pan.baidu.com/s/1FBZEjGfX4nGu-2arqzAtAw
提取码:80tr