往窗口添加一个Graphics View,然后提升为QChartView,
QtCharts绘制四条动态折线图 - 图1

dx1000_charts.h

  1. #ifndef DX1000_CHARTS_H
  2. #define DX1000_CHARTS_H
  3. #include <QWidget>
  4. #include <QWidget>
  5. #include <QtCharts>
  6. #include <QtCharts/QSplineSeries>
  7. #include <QDateTime>
  8. QT_CHARTS_USE_NAMESPACE //使用qtchart需要加入这条语句
  9. namespace Ui {
  10. class DX1000_Charts;
  11. }
  12. class DX1000_Charts : public QWidget
  13. {
  14. Q_OBJECT
  15. public:
  16. // explicit DX1000_Charts(QWidget *parent = 0);
  17. DX1000_Charts(QString name, int min, int max);
  18. ~DX1000_Charts();
  19. /*menbers**************************************************************************************/
  20. //声明QChart的实例,QSplineSeries的实例
  21. QChart *chart;
  22. // 4条折线
  23. QSplineSeries *series1;
  24. QSplineSeries *series2;
  25. QSplineSeries *series3;
  26. QSplineSeries *series4;
  27. /*funcions **************************************************************************************/
  28. //声明划线的函数和初始化QChart的函数
  29. void drawLine(float Y1 = 0, float Y2 = 0, float Y3 = 0, float Y4 = 0);
  30. void initChart(QString name, int min, int max);
  31. public slots:
  32. /*slot function**********************************************************************************/
  33. //声明timer的槽函数
  34. void timerDeal(float Y1 = 0, float Y2 = 0, float Y3 = 0, float Y4 = 0);
  35. private:
  36. Ui::DX1000_Charts *ui;
  37. };
  38. #endif // DX1000_CHARTS_H

dx1000_charts.cpp

  1. #include "dx1000_charts.h"
  2. #include "ui_dx1000_charts.h"
  3. #include <QtCharts/QAbstractAxis>
  4. #include <QtCharts/QSplineSeries>
  5. #include <QtCharts/QValueAxis>
  6. #include <QtCore/QTime>
  7. #include <QtCore/QDebug>
  8. #include <QPen>
  9. #include <QPainter>
  10. #include <QtCharts\QLegendMarker>
  11. //DX1000_Charts::DX1000_Charts(QWidget *parent) :
  12. // QWidget(parent),
  13. DX1000_Charts::DX1000_Charts(QString name, int min, int max) :
  14. ui(new Ui::DX1000_Charts)
  15. {
  16. ui->setupUi(this);
  17. //初始化QChart
  18. initChart(name, min, max);
  19. }
  20. DX1000_Charts::~DX1000_Charts()
  21. {
  22. delete ui;
  23. }
  24. //实现QChart的初始化函数
  25. void DX1000_Charts::initChart(QString name, int min, int max)
  26. {
  27. //初始化QChart的实例
  28. chart=new QChart();
  29. chart->setTitle(name);
  30. //初始化两个QSplineSeries的实例
  31. series1=new QSplineSeries();
  32. series2=new QSplineSeries();
  33. series3=new QSplineSeries();
  34. series4=new QSplineSeries();
  35. //设置两条曲线的名称
  36. series1->setName("1号气");
  37. series2->setName("1号油");
  38. series3->setName("2号气");
  39. series4->setName("2号油");
  40. //把曲线添加到QChart的实例chart中
  41. chart->addSeries(series1);
  42. chart->addSeries(series2);
  43. chart->addSeries(series3);
  44. chart->addSeries(series4);
  45. //声明并初始化X轴、两个Y轴
  46. QDateTimeAxis * axisX=new QDateTimeAxis();
  47. axisX->setTickCount(2);
  48. axisX->setFormat("MM-dd hh:mm:ss");
  49. // QValueAxis *axisX = new QValueAxis();
  50. QValueAxis *axisY_1=new QValueAxis();
  51. QValueAxis *axisY_2=new QValueAxis();
  52. //设置坐标轴显示的范围
  53. axisX->setMin(QDateTime::currentDateTime().addSecs(-60*1));
  54. axisX->setMax(QDateTime::currentDateTime().addSecs(0));
  55. axisY_1->setMin(min);
  56. axisY_1->setMax(max);
  57. axisY_2->setMin(min);
  58. axisY_2->setMax(max);
  59. //设置坐标轴上的格点
  60. axisY_1->setTickCount(11);
  61. axisY_2->setTickCount(11);
  62. //设置坐标轴显示的名称
  63. // axisX->setTitleText("时间");
  64. // axisY_1->setTitleText("axisY_1-series1");
  65. axisY_2->setTitleText("(L)");
  66. //设置坐标轴的颜色,粗细,设置网格不显示
  67. axisY_1->setLinePenColor(QColor(Qt::darkBlue));
  68. axisY_1->setGridLineColor(QColor(Qt::darkBlue));
  69. axisY_2->setLinePenColor(QColor(Qt::darkGreen));
  70. axisY_2->setGridLineColor(QColor(Qt::darkGreen));
  71. axisY_1->setGridLineVisible(false);
  72. axisY_2->setGridLineVisible(false);
  73. QPen penY1(Qt::darkBlue,3,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin);
  74. QPen penY2(Qt::darkGreen,3,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin);
  75. axisY_1->setLinePen(penY1);
  76. axisY_2->setLinePen(penY2);
  77. //把坐标轴添加到chart中,
  78. //addAxis函数的第二个参数是设置坐标轴的位置,
  79. //只有四个选项,下方:Qt::AlignBottom,左边:Qt::AlignLeft,右边:Qt::AlignRight,上方:Qt::AlignTop
  80. chart->addAxis(axisX,Qt::AlignBottom);
  81. chart->addAxis(axisY_1,Qt::AlignLeft);
  82. chart->addAxis(axisY_2,Qt::AlignRight);
  83. //把曲线关联到坐标轴
  84. series1->attachAxis(axisX);
  85. series1->attachAxis(axisY_1);
  86. series2->attachAxis(axisX);
  87. series2->attachAxis(axisY_2);
  88. series3->attachAxis(axisX);
  89. series3->attachAxis(axisY_2);
  90. series4->attachAxis(axisX);
  91. series4->attachAxis(axisY_2);
  92. //把chart显示到窗口上
  93. ui->graphicsView->setChart(chart);
  94. }
  95. //实现画线函数,动态更新
  96. void DX1000_Charts::drawLine(float Y1, float Y2, float Y3, float Y4)
  97. {
  98. //每增加一个点改变X轴的范围,实现曲线的动态更新效果
  99. QDateTime bjtime=QDateTime::currentDateTime();
  100. qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
  101. chart->axisX()->setMin(QDateTime::currentDateTime().addSecs(-60*1));
  102. chart->axisX()->setMax(QDateTime::currentDateTime().addSecs(0));
  103. //当曲线上最早的点超出X轴的范围时,剔除最早的点,
  104. if(series1->count()>135)
  105. {
  106. series1->removePoints(0,series1->count()-135);
  107. }
  108. if(series2->count()>119)
  109. {
  110. series2->removePoints(0,series2->count()-119);
  111. }
  112. if(series3->count()>119)
  113. {
  114. series3->removePoints(0,series3->count()-119);
  115. }
  116. if(series4->count()>119)
  117. {
  118. series4->removePoints(0,series4->count()-119);
  119. }
  120. // int Y1=qrand()%9;//随机生成0到9的随机数
  121. // int Y2=9+qrand()%9;//随机生成9到18的随机数
  122. //增加新的点到曲线末端
  123. series1->append(bjtime.toMSecsSinceEpoch(),Y1);
  124. series2->append(bjtime.toMSecsSinceEpoch(),Y2);
  125. series3->append(bjtime.toMSecsSinceEpoch(),Y3);
  126. series4->append(bjtime.toMSecsSinceEpoch(),Y4);
  127. }
  128. //实现timer的槽函数
  129. void DX1000_Charts::timerDeal(float Y1, float Y2, float Y3, float Y4)
  130. {
  131. //定时画曲线
  132. drawLine(Y1, Y2, Y3, Y4);
  133. }

dx1000_dialogsp.h

  1. #ifndef DX1000_DIALOGSP_H
  2. #define DX1000_DIALOGSP_H
  3. #include <QWidget>
  4. #include <QSerialPort>
  5. #include "dx1000_dialogspselect.h"
  6. #include <QTimer>
  7. #include "dx1000_charts.h"
  8. namespace Ui {
  9. class Dx1000_dialogSP;
  10. }
  11. class Dx1000_dialogSP : public QWidget
  12. {
  13. Q_OBJECT
  14. public:
  15. explicit Dx1000_dialogSP(QWidget *parent = 0);
  16. ~Dx1000_dialogSP();
  17. // DX1000_Charts *chart;
  18. DX1000_Charts *chart = new DX1000_Charts("实时量", 0, 100);
  19. DX1000_Charts *chart2 = new DX1000_Charts("累计量", 0, 1000);
  20. bool mIsOpen = false;
  21. bool getSerialPortConfig(QString name, QString rate , QString parity, QString dataBits, QString stopBits);
  22. QString ascTohex(QByteArray array);
  23. QTimer *timer; // 定时器
  24. // 接收串口设置的参数
  25. QString m_name = NULL;
  26. QString m_rate = NULL;
  27. QString m_parity = NULL;
  28. QString m_dataBits = NULL;
  29. QString m_stopBits = NULL;
  30. // 图片
  31. QPixmap pix_red; // 红色灯
  32. QPixmap pix_green; // 绿色灯
  33. QPixmap pix_gray; // 灰色灯
  34. QPixmap pix_open; // 打开图片
  35. QPixmap pix_close; // 关闭图片
  36. QByteArray recvDataAll; // 存储数据 A数据
  37. int lan = 0; // 串口接收的数据长度 A数据
  38. uint dataLang; // 接收的数据位
  39. bool isOnc = true;
  40. QString isSendData = NULL; // 数据存储 校验
  41. bool isAllA = true; // 判断A数据是否接收完成
  42. bool isAllB = true; // 判断B数据是否接收完成
  43. bool isOpen = false; // 压力按钮是否点击了
  44. QString TAG = NULL; // 标记
  45. // 指令合并方法 参数1:数据,
  46. QString merge(QString argeMes );
  47. bool isClick = false;
  48. private:
  49. Ui::Dx1000_dialogSP *ui;
  50. QSerialPort mSerialPort;
  51. // dx1000_dialogspselect弹框
  52. DX1000_DialogSPSelect * dx1000_dialogspselect = NULL;
  53. signals:
  54. void isLink(bool isLinks);
  55. // 信号
  56. void dataD(float a, float b, float c, float d);
  57. void dataD2(float a, float b, float c, float d);
  58. private slots:
  59. void on_buttonOpenClear_clicked();
  60. void on_buttonSend_clicked();
  61. // 读取文件槽函数
  62. void on_SerialPort_readyRead();
  63. // 获取信息
  64. void test(QString name, QString rate , QString parity, QString dataBits, QString stopBits);
  65. void on_status_clicked();
  66. void on_sendClick_clicked();
  67. void on_stressStatus_clicked();
  68. };
  69. #endif // DX1000_DIALOGSP_H

dx1000_dialogsp.cpp

  1. #include "dx1000_dialogsp.h"
  2. #include "ui_dx1000_dialogsp.h"
  3. #include <QDebug>
  4. #include <QSerialPortInfo>
  5. #include <QSerialPort>
  6. #include "JQChecksum.h"
  7. #include "dx_1000_macrodef.h"
  8. Dx1000_dialogSP::Dx1000_dialogSP(QWidget *parent) :
  9. QWidget(parent),
  10. ui(new Ui::Dx1000_dialogSP)
  11. {
  12. ui->setupUi(this);
  13. this->setWindowTitle("串口调试");
  14. this->resize(850, 600);
  15. // 在界面显示
  16. chart->setParent(ui->graphicsView);
  17. chart2->setParent(ui->graphicsView_2);
  18. // 连接
  19. connect(this, &Dx1000_dialogSP::dataD, chart, &DX1000_Charts::timerDeal);
  20. connect(this, &Dx1000_dialogSP::dataD2, chart2, &DX1000_Charts::timerDeal);
  21. // 设置定时器
  22. QTimer *tim = new QTimer;
  23. connect(tim, &QTimer::timeout, [=](){
  24. emit this->dataD2(50.0, 80.5, 55, 65);
  25. emit this->dataD(10.0, 20.5, 66, 70);
  26. });
  27. tim->start(500);
  28. }