Qt QChart,利用QChart绘制动态曲线

Qt QChart,利用QChart绘制动态曲线

2017年07月11日 20:18:27 wudroid 阅读数 21511

 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HiccupHiccup/article/details/74996618

这是一个简单的demo,在更新数据的时候我采用了官方中audio这个example的方式。

 

效果图

 

程序

-------------------------------------------------------------------------------------

运行环境 :

Qt Creator 4.2.1

Based on Qt 5.8.0 (MSVC 2015, 32 bit)

 

--------------------------------------------------------------------------------------

QtChartsTest.pro

这个文件中唯一需要添加的是

QT += charts

其他可以不看

 

 
  1. #-------------------------------------------------

  2. #

  3. # Project created by QtCreator 2017-07-11T10:12:57

  4. #

  5. #-------------------------------------------------

  6.  
  7. QT += core gui

  8.  
  9. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

  10.  
  11. TARGET = QtChartsTest

  12. TEMPLATE = app

  13.  
  14. # The following define makes your compiler emit warnings if you use

  15. # any feature of Qt which as been marked as deprecated (the exact warnings

  16. # depend on your compiler). Please consult the documentation of the

  17. # deprecated API in order to know how to port your code away from it.

  18. DEFINES += QT_DEPRECATED_WARNINGS

  19.  
  20. # You can also make your code fail to compile if you use deprecated APIs.

  21. # In order to do so, uncomment the following line.

  22. # You can also select to disable deprecated APIs only up to a certain version of Qt.

  23. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0

  24.  
  25.  
  26. SOURCES += main.cpp\

  27. mainwindow.cpp

  28.  
  29. HEADERS += mainwindow.h

  30.  
  31. FORMS += mainwindow.ui

  32.  
  33. QT += charts

 

 

mainwindow.h

这个文件声明了一个定时器的槽和一个获得数据的方法

 

 
  1. #ifndef MAINWINDOW_H

  2. #define MAINWINDOW_H

  3.  
  4. #include <QMainWindow>

  5.  
  6. namespace Ui {

  7. class MainWindow;

  8. }

  9.  
  10. class MainWindow : public QMainWindow

  11. {

  12. Q_OBJECT

  13.  
  14. public:

  15. explicit MainWindow(QWidget *parent = 0);

  16. ~MainWindow();

  17. protected:

  18. void timerEvent(QTimerEvent *event) Q_DECL_OVERRIDE;

  19. private:

  20. Ui::MainWindow *ui;

  21. double getData(double time);

  22.  
  23. };

  24.  
  25. #endif // MAINWINDOW_H


mainwindow.cpp

 

主程序中配置好Qchart,QLineSeries是用来存放数据。更新的工作放在定时器的槽中。其中

 

m_series->setUseOpenGL(true);//openGl 加速

采用openGL加速,绘图速度加快

 

 
  1. #include "mainwindow.h"

  2. #include "ui_mainwindow.h"

  3. #include "QtCharts/QChart"

  4. #include "QLineSeries"

  5. #include "QValueAxis"

  6. #include "QTimer"

  7. #include "QTime"

  8. #include "QList"

  9. #include "qmath.h"

  10. #include "QPointF"

  11. #include "QDebug"

  12.  
  13. //#include <QtCharts/QChartGlobal>

  14. #include "QChartView"

  15. QT_CHARTS_USE_NAMESPACE

  16. QChart *m_chart;

  17. QLineSeries *m_series;

  18. //QList<double> dataList;//存储业务数据

  19. int maxSize = 5000;

  20.  
  21. //QTimer updateTimer;

  22. int timeId;

  23. MainWindow::MainWindow(QWidget *parent) :

  24. QMainWindow(parent),//默认初始化?

  25. ui(new Ui::MainWindow)

  26. {

  27. ui->setupUi(this);

  28.  
  29. m_chart = new QChart;

  30. QChartView *chartView = new QChartView(m_chart);

  31. // v.setRubberBand(QChartView::HorizontalRubberBand);

  32. chartView->setRubberBand(QChartView::RectangleRubberBand);

  33. // chartView->setRubberBand();

  34.  
  35. m_series = new QLineSeries;

  36. m_chart->addSeries(m_series);

  37.  
  38. for(int i=0;i<maxSize;++i){

  39. m_series->append(i,0);

  40. }

  41. m_series->setUseOpenGL(true);//openGl 加速

  42. qDebug()<<m_series->useOpenGL();

  43.  
  44. QValueAxis *axisX = new QValueAxis;

  45. axisX->setRange(0,maxSize);

  46. axisX->setLabelFormat("%g");

  47. axisX->setTitleText("axisX");

  48.  
  49. QValueAxis *axisY = new QValueAxis;

  50. axisY->setRange(-1.5,1.5);

  51. axisY->setTitleText("axisY");

  52.  
  53. m_chart->setAxisX(axisX,m_series);

  54. m_chart->setAxisY(axisY,m_series);

  55. m_chart->legend()->hide();

  56. m_chart->setTitle("demo");

  57.  
  58. QVBoxLayout *layout = ui->verticalLayout;

  59. layout->addWidget(chartView);

  60. timeId = startTimer(30);

  61. }

  62.  
  63.  
  64. double MainWindow::getData(double time){

  65.  
  66. double s = qCos( time * M_PI * 2 ) ;

  67. return s;

  68. }

  69.  
  70. void MainWindow::timerEvent(QTimerEvent *event){

  71. if(event->timerId()==timeId){//定时器到时间,//模拟数据填充

  72. static QTime dataTime(QTime::currentTime());

  73. long int eltime = dataTime.elapsed();

  74. static int lastpointtime = 0;

  75. int size = (eltime - lastpointtime);//数据个数

  76. qDebug()<<"size-->"<<size;

  77. if(isVisible()){

  78. QVector<QPointF> oldPoints = m_series->pointsVector();//Returns the points in the series as a vector

  79. QVector<QPointF> points;

  80.  
  81. for(int i=size;i<oldPoints.count();++i){

  82. points.append(QPointF(i-size ,oldPoints.at(i).y()));//替换数据用

  83. }

  84. qint64 sizePoints = points.count();

  85. for(int k=0;k<size;++k){

  86. points.append(QPointF(k+sizePoints,getData((((double)lastpointtime+k+1)/1000))));

  87. }

  88. m_series->replace(points);

  89. lastpointtime = eltime;

  90. }

  91. }

  92. }

  93. MainWindow::~MainWindow()

  94. {

  95. delete ui;

  96. }

 

 

main.cpp

没什么好说的

 

 
  1. #include "mainwindow.h"

  2. #include <QApplication>

  3.  
  4. int main(int argc, char *argv[])

  5. {

  6. QApplication a(argc, argv);

  7. MainWindow w;

  8. w.show();

  9.  
  10. return a.exec();

  11. }

 

 

mainwindow.ui

这个里自己放一个vertical Layout

 

这只是我根据别人的程序写的简单demo,有问题欢迎讨论。
 

demo文件:

链接:http://pan.baidu.com/s/1cKXtIQ 密码:5sm2

Qt是一个跨平台的应用程序开发框架,它提供了丰富的图形界面组件和功能库。C++是Qt的主要编程语言,而QChart是Qt提供的一个用于绘制图表的模块。 实时动态绘制曲线是指通过不断更新数据,并在图表上实时展示出来,形成曲线的变化过程。在Qt中使用QChart实现实时动态绘制曲线,可以按照以下步骤进行: 1. 首先,引入必要的头文件和命名空间: #include <QtWidgets/QApplication> #include <QtWidgets/QMainWindow> #include <QtCharts/QChartView> #include <QtCharts/QLineSeries> #include <QTimer> QT_CHARTS_USE_NAMESPACE 2. 创建主窗口,并设置布局: QMainWindow window; QHBoxLayout *mainLayout = new QHBoxLayout; window.setLayout(mainLayout); 3. 创建一个QChart对象,并设置为主窗口的中心部件: QLineSeries *series = new QLineSeries; QChart *chart = new QChart; chart->addSeries(series); chart->createDefaultAxes(); chart->legend()->hide(); QChartView *chartView = new QChartView(chart); mainLayout->addWidget(chartView); 4. 创建一个定时器,并设置定时器的超时槽函数。在该槽函数中更新曲线数据,并重新绘制QTimer *timer = new QTimer; QObject::connect(timer, &QTimer::timeout, [&series]() { static qreal x = 0; static qreal y = 0; series->append(x, y); // 更新数据 x++; y++; }); 5. 启动定时器,并显示主窗口: timer->start(100); // 设置定时器间隔,单位为毫秒 window.show(); return app.exec(); 通过以上步骤,我们可以在Qt中使用QChart实现实时动态绘制曲线。定时器每隔一定的时间间隔触发,更新曲线的数据,并实时绘制在图表上,从而实现曲线动态变化效果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值