qt实现简单的动态取点线

      相信小伙伴们在做数据采集后,想要动态的获取点,实时的显示在图上,好看好数据,下面这个例子可以实现这个功能,大家可以对其进行相对应的更改,达到你实现的想法:

     实现效果:

 

如果大家不想用直线,想用平滑曲线,把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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章