Qt---实时动态画图

项目需要用到画图界面,且x,y轴需要根据传入点的坐标更新x,y轴的坐标,并且汇入表格,话不多说,直接上代码

Qt         +=chrts

.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include<stdio.h>
#include <QMainWindow>
#include <QtCharts>
#include <QtCharts/QSplineSeries>
#include <QDateTime>
#include<QTextEdit>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    //声明QChart的实例,QSplineSeries的实例
    QChart *chart;
    QSplineSeries *series1;
    QSplineSeries *series2;
    QSplineSeries *series3;
    QSplineSeries *series4;
    //声明timer
    QTimer *timer;

    /*funcions **************************************************************************************/
    //声明划线的函数和初始化QChart的函数
    void drawLine();
    void initChart();

public slots:
    /*slot function**********************************************************************************/
    //声明voltage的槽函数
    void timerDeal();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

 

.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <math.h>
#include <QThread>
//#include<QTextEdit>

QT_CHARTS_USE_NAMESPACE
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //初始化QChart
    initChart();

    //设置timer,槽连接到
    timer = new QTimer();
    timer->setInterval(400);
    connect(timer,SIGNAL(timeout()),this,SLOT(timerDeal()));
    timer->start();
}

MainWindow::~MainWindow()
{
    delete ui;
}

//实现QChart的初始化函数
void MainWindow::initChart()
{
    //初始化QChart的实例
    chart = new QChart();

    //初始化两个QSplineSeries的实例
    series1 = new QSplineSeries();
    series2 = new QSplineSeries();
    series3 = new QSplineSeries();
    series4 = new QSplineSeries();
    //设置两条曲线的名称
    series1->setName("series1");
    series2->setName("series2");
    series3->setName("series3");
    series4->setName("series4");

    //把曲线添加到QChart的实例chart中
    chart->addSeries(series1);
    chart->addSeries(series2);
    chart->addSeries(series3);
    chart->addSeries(series4);

    //声明并初始化X轴、两个Y轴
    QDateTimeAxis *axisX = new QDateTimeAxis();
    //QValueAxis *axisX = new QValueAxis();
    QValueAxis *axisY_1 = new QValueAxis();
    QValueAxis *axisY_2 = new QValueAxis();
    //设置坐标轴显示的范围
    axisX->setMin(QDateTime::currentDateTime().addSecs(-60 * 1));
    axisX->setMax(QDateTime::currentDateTime().addSecs(0));
    axisY_1->setMin(0);
    axisY_1->setMax(60);
    axisY_2->setMin(0);
    axisY_2->setMax(60);

    //设置坐标轴上的格点
    axisX->setTickCount(10);
    axisY_1->setTickCount(7);
    axisY_2->setTickCount(7);
    //设置坐标轴显示的名称
    axisX->setTitleText("X");//我写在这里了
    axisY_1->setTitleText("Y1");
    axisY_2->setTitleText("Y2");
    //设置坐标轴的颜色,粗细,设置网格不显示
    axisY_1->setLinePenColor(QColor(Qt::darkBlue));
    axisY_1->setGridLineColor(QColor(Qt::darkBlue));
    axisY_2->setLinePenColor(QColor(Qt::darkGreen));
    axisY_2->setGridLineColor(QColor(Qt::darkGreen));
    axisY_1->setGridLineVisible(false);
    axisY_2->setGridLineVisible(false);
    QPen penY1(Qt::darkBlue, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
    QPen penY2(Qt::darkGreen, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
    axisY_1->setLinePen(penY1);
    axisY_2->setLinePen(penY2);

    //把坐标轴添加到chart中,
    //addAxis函数的第二个参数是设置坐标轴的位置,
    //只有四个选项,下方:Qt::AlignBottom,左边:Qt::AlignLeft,右边:Qt::AlignRight,上方:Qt::AlignTop
    chart->addAxis(axisX, Qt::AlignBottom);
    chart->addAxis(axisY_1, Qt::AlignLeft);
    chart->addAxis(axisY_2, Qt::AlignRight);

    //把曲线关联到坐标轴
    series1->attachAxis(axisX);
    series1->attachAxis(axisY_1);
    series2->attachAxis(axisX);
    series2->attachAxis(axisY_1);
    series3->attachAxis(axisX);
    series3->attachAxis(axisY_1);
    series4->attachAxis(axisX);
    series4->attachAxis(axisY_1);


    //把chart显示到窗口上
    ui->graphicsView->setChart(chart);

}

//实现画线函数,动态更新
void MainWindow::drawLine()
{
    //每增加一个点改变X轴的范围,实现曲线的动态更新效果
    QDateTime bjtime = QDateTime::currentDateTime();
    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
    chart->axisX()->setMin(QDateTime::currentDateTime().addSecs(-60 * 1));
    chart->axisX()->setMax(QDateTime::currentDateTime().addSecs(0));

    //当曲线上最早的点超出X轴的范围时,剔除最早的点,
    if(series1->count() > 119)
    {
        series1->removePoints(0,series1->count() - 119);
    }
    if(series2->count() > 119)
    {
        series2->removePoints(0,series2->count() - 119);
    }
    if(series3->count() > 119)
    {
        series3->removePoints(0,series1->count() - 119);
    }
    if(series4->count() > 119)
    {
        series4->removePoints(0,series2->count() - 119);
    }


    int Y1 = qrand()%9;   //随机生成0到9的随机数
    int Y2 = 9 + qrand()%9;//随机生成9到18的随机数
    int Y3 = 18+qrand()%9;   //随机生成18到27的随机数
    int Y4 = 27 + qrand()%9;//随机生成27到36的随机数
    //增加新的点到曲线末端
    series1->append(bjtime.toMSecsSinceEpoch(), Y1);
    series2->append(bjtime.toMSecsSinceEpoch(), Y2);
    series3->append(bjtime.toMSecsSinceEpoch(), Y3);
    series4->append(bjtime.toMSecsSinceEpoch(), Y4);


}
//实现timer的槽函数
void MainWindow::timerDeal()
{
    //定时画曲线
    drawLine();
}

 

  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值