往窗口添加一个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_OBJECT
public:
// 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);
//初始化QChart
initChart(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::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_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_OBJECT
public:
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);
}