项目需要用到画图界面,且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();
}