往窗口添加一个Graphics View,然后提升为QChartView,
dx1000_charts.h
#ifndef DX1000_CHARTS_H#define DX1000_CHARTS_H#include <QWidget>#include <QWidget>#include <QtCharts>#include <QtCharts/QSplineSeries>#include <QDateTime>QT_CHARTS_USE_NAMESPACE //使用qtchart需要加入这条语句namespace Ui {class DX1000_Charts;}class DX1000_Charts : public QWidget{Q_OBJECTpublic:// explicit DX1000_Charts(QWidget *parent = 0);DX1000_Charts(QString name, int min, int max);~DX1000_Charts();/*menbers**************************************************************************************///声明QChart的实例,QSplineSeries的实例QChart *chart;// 4条折线QSplineSeries *series1;QSplineSeries *series2;QSplineSeries *series3;QSplineSeries *series4;/*funcions **************************************************************************************///声明划线的函数和初始化QChart的函数void drawLine(float Y1 = 0, float Y2 = 0, float Y3 = 0, float Y4 = 0);void initChart(QString name, int min, int max);public slots:/*slot function**********************************************************************************///声明timer的槽函数void timerDeal(float Y1 = 0, float Y2 = 0, float Y3 = 0, float Y4 = 0);private:Ui::DX1000_Charts *ui;};#endif // DX1000_CHARTS_H
dx1000_charts.cpp
#include "dx1000_charts.h"#include "ui_dx1000_charts.h"#include <QtCharts/QAbstractAxis>#include <QtCharts/QSplineSeries>#include <QtCharts/QValueAxis>#include <QtCore/QTime>#include <QtCore/QDebug>#include <QPen>#include <QPainter>#include <QtCharts\QLegendMarker>//DX1000_Charts::DX1000_Charts(QWidget *parent) :// QWidget(parent),DX1000_Charts::DX1000_Charts(QString name, int min, int max) :ui(new Ui::DX1000_Charts){ui->setupUi(this);//初始化QChartinitChart(name, min, max);}DX1000_Charts::~DX1000_Charts(){delete ui;}//实现QChart的初始化函数void DX1000_Charts::initChart(QString name, int min, int max){//初始化QChart的实例chart=new QChart();chart->setTitle(name);//初始化两个QSplineSeries的实例series1=new QSplineSeries();series2=new QSplineSeries();series3=new QSplineSeries();series4=new QSplineSeries();//设置两条曲线的名称series1->setName("1号气");series2->setName("1号油");series3->setName("2号气");series4->setName("2号油");//把曲线添加到QChart的实例chart中chart->addSeries(series1);chart->addSeries(series2);chart->addSeries(series3);chart->addSeries(series4);//声明并初始化X轴、两个Y轴QDateTimeAxis * axisX=new QDateTimeAxis();axisX->setTickCount(2);axisX->setFormat("MM-dd hh:mm:ss");// 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(min);axisY_1->setMax(max);axisY_2->setMin(min);axisY_2->setMax(max);//设置坐标轴上的格点axisY_1->setTickCount(11);axisY_2->setTickCount(11);//设置坐标轴显示的名称// axisX->setTitleText("时间");// axisY_1->setTitleText("axisY_1-series1");axisY_2->setTitleText("(L)");//设置坐标轴的颜色,粗细,设置网格不显示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::AlignTopchart->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_2);series3->attachAxis(axisX);series3->attachAxis(axisY_2);series4->attachAxis(axisX);series4->attachAxis(axisY_2);//把chart显示到窗口上ui->graphicsView->setChart(chart);}//实现画线函数,动态更新void DX1000_Charts::drawLine(float Y1, float Y2, float Y3, float Y4){//每增加一个点改变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()>135){series1->removePoints(0,series1->count()-135);}if(series2->count()>119){series2->removePoints(0,series2->count()-119);}if(series3->count()>119){series3->removePoints(0,series3->count()-119);}if(series4->count()>119){series4->removePoints(0,series4->count()-119);}// int Y1=qrand()%9;//随机生成0到9的随机数// int Y2=9+qrand()%9;//随机生成9到18的随机数//增加新的点到曲线末端series1->append(bjtime.toMSecsSinceEpoch(),Y1);series2->append(bjtime.toMSecsSinceEpoch(),Y2);series3->append(bjtime.toMSecsSinceEpoch(),Y3);series4->append(bjtime.toMSecsSinceEpoch(),Y4);}//实现timer的槽函数void DX1000_Charts::timerDeal(float Y1, float Y2, float Y3, float Y4){//定时画曲线drawLine(Y1, Y2, Y3, Y4);}
dx1000_dialogsp.h
#ifndef DX1000_DIALOGSP_H#define DX1000_DIALOGSP_H#include <QWidget>#include <QSerialPort>#include "dx1000_dialogspselect.h"#include <QTimer>#include "dx1000_charts.h"namespace Ui {class Dx1000_dialogSP;}class Dx1000_dialogSP : public QWidget{Q_OBJECTpublic:explicit Dx1000_dialogSP(QWidget *parent = 0);~Dx1000_dialogSP();// DX1000_Charts *chart;DX1000_Charts *chart = new DX1000_Charts("实时量", 0, 100);DX1000_Charts *chart2 = new DX1000_Charts("累计量", 0, 1000);bool mIsOpen = false;bool getSerialPortConfig(QString name, QString rate , QString parity, QString dataBits, QString stopBits);QString ascTohex(QByteArray array);QTimer *timer; // 定时器// 接收串口设置的参数QString m_name = NULL;QString m_rate = NULL;QString m_parity = NULL;QString m_dataBits = NULL;QString m_stopBits = NULL;// 图片QPixmap pix_red; // 红色灯QPixmap pix_green; // 绿色灯QPixmap pix_gray; // 灰色灯QPixmap pix_open; // 打开图片QPixmap pix_close; // 关闭图片QByteArray recvDataAll; // 存储数据 A数据int lan = 0; // 串口接收的数据长度 A数据uint dataLang; // 接收的数据位bool isOnc = true;QString isSendData = NULL; // 数据存储 校验bool isAllA = true; // 判断A数据是否接收完成bool isAllB = true; // 判断B数据是否接收完成bool isOpen = false; // 压力按钮是否点击了QString TAG = NULL; // 标记// 指令合并方法 参数1:数据,QString merge(QString argeMes );bool isClick = false;private:Ui::Dx1000_dialogSP *ui;QSerialPort mSerialPort;// dx1000_dialogspselect弹框DX1000_DialogSPSelect * dx1000_dialogspselect = NULL;signals:void isLink(bool isLinks);// 信号void dataD(float a, float b, float c, float d);void dataD2(float a, float b, float c, float d);private slots:void on_buttonOpenClear_clicked();void on_buttonSend_clicked();// 读取文件槽函数void on_SerialPort_readyRead();// 获取信息void test(QString name, QString rate , QString parity, QString dataBits, QString stopBits);void on_status_clicked();void on_sendClick_clicked();void on_stressStatus_clicked();};#endif // DX1000_DIALOGSP_H
dx1000_dialogsp.cpp
#include "dx1000_dialogsp.h"#include "ui_dx1000_dialogsp.h"#include <QDebug>#include <QSerialPortInfo>#include <QSerialPort>#include "JQChecksum.h"#include "dx_1000_macrodef.h"Dx1000_dialogSP::Dx1000_dialogSP(QWidget *parent) :QWidget(parent),ui(new Ui::Dx1000_dialogSP){ui->setupUi(this);this->setWindowTitle("串口调试");this->resize(850, 600);// 在界面显示chart->setParent(ui->graphicsView);chart2->setParent(ui->graphicsView_2);// 连接connect(this, &Dx1000_dialogSP::dataD, chart, &DX1000_Charts::timerDeal);connect(this, &Dx1000_dialogSP::dataD2, chart2, &DX1000_Charts::timerDeal);// 设置定时器QTimer *tim = new QTimer;connect(tim, &QTimer::timeout, [=](){emit this->dataD2(50.0, 80.5, 55, 65);emit this->dataD(10.0, 20.5, 66, 70);});tim->start(500);}
