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

 

 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值