Qt繪制動態曲線


首先*.pro文件中加一句

QT       += charts

然后
mainwindow.cpp文件如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QtCharts/QChart"
#include "QLineSeries"
#include "QValueAxis"
#include "QTimer"
#include "QTime"
#include "QList"
#include "qmath.h"
#include "QPointF"
#include "QDebug"
 
        
//#include <QtCharts/QChartGlobal>
#include "QChartView"
 
        
QT_CHARTS_USE_NAMESPACE
QChart *m_chart;
QLineSeries *m_series;
//QList<double> dataList;//存儲業務數據
int maxSize = 5000;
int tem=0,flag=0;
//QTimer updateTimer;
int timeId;
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),//默認初始化?
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
        
    m_chart = new QChart;//圖表類
    QChartView *chartView = new QChartView(m_chart);//圖表視窗類
//    v.setRubberBand(QChartView::HorizontalRubberBand);
    chartView->setRubberBand(QChartView::RectangleRubberBand);//在圖表窗口設置矩形橡皮筋
//    chartView->setRubberBand();
 
        
    m_series = new QLineSeries;//線 連續類
    m_chart->addSeries(m_series);//在圖表類添加連續線
 
        
    for(int i=0;i<maxSize;++i){
       m_series->append(i,0);//在線連續類附加坐標x&y
    }
    m_series->setUseOpenGL(true);//openGl 加速
    qDebug()<<m_series->useOpenGL();
 
        
    QValueAxis *axisX = new QValueAxis;//數值軸類
    axisX->setRange(0,maxSize);//設置X坐標的范圍
    axisX->setLabelFormat("%g");//設置標簽格式
    axisX->setTitleText("axisX");//設置X坐標的標題名稱
 
        
    QValueAxis *axisY = new QValueAxis;
    axisY->setRange(0,2000);//設置Y坐標的范圍  可以設置負數
    axisY->setTitleText("axisY");//設置Y坐標的標題名稱
 
        
    m_chart->setAxisX(axisX,m_series);//將軸添加在圖表中
    m_chart->setAxisY(axisY,m_series);//
    m_chart->legend()->hide();//圖列隱藏 有一個藍色的小點被隱藏了。
    m_chart->setTitle("demo");//設置曲線表的名稱
 
        
    QVBoxLayout *layout = ui->verticalLayout;//垂直布局 方框類
    layout->addWidget(chartView);//在方框內添加圖表視窗
    timeId = startTimer(0);//感覺像是刷新頻率的延時。 定義了timeId整型變量作為刷新的定時器變量。
}
 
        
 
        
double MainWindow::getData(double time){
 
        
    double s = qCos( time * M_PI * 2 ) ;
    return s;
}
 
        
void MainWindow::timerEvent(QTimerEvent *event){//定時器事件
    if(event->timerId()==timeId){//定時器到時間,//模擬數據填充
        static QTime dataTime(QTime::currentTime());//現在的時間
        long int eltime = dataTime.elapsed();//消逝的時間
        static int lastpointtime = 0;//最后一點時間
        int size = (eltime - lastpointtime);//數據個數
        qDebug()<<"size-->"<<size;
        if(isVisible()){//判斷一個控件是否可見
            //矢量類 < 打印函數類 >
            QVector<QPointF> oldPoints = m_series->pointsVector();//線連續類 點向量//Returns the points in the series as a vector
            QVector<QPointF> points;//點
 
        
             for(int i=size;i<oldPoints.count();++i){
                 points.append(QPointF(i-size ,oldPoints.at(i).y()));//替換數據用
             }
 
        
                if(tem < 1000 && flag == 0)
                {
                    tem+=10;
                    if(tem>=999)
                        flag=1;
                }
                if(tem >0 && flag==1)
                {
                    tem-=10;
                    if(tem<=0)
                        flag=0;
                }
             qint64 sizePoints = points.count();
              for(int k=0;k<size;++k){
                //points.append(QPointF(k+sizePoints,1.2*getData((((double)lastpointtime+k+1)/1000))));
                points.append(QPointF(k+sizePoints,tem));
             }
            m_series->replace(points);//替換以前的點
            lastpointtime = eltime;//消逝的時間復制給最后一點的時間。
       }
    }
}
MainWindow::~MainWindow()
{
    delete ui;
}
然后mainwindow.h如下:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
        
#include <QMainWindow>
 
        
namespace Ui {
class MainWindow;
}
 
        
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
        
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
protected:
    void timerEvent(QTimerEvent *event) Q_DECL_OVERRIDE;
private:
    Ui::MainWindow *ui;
    double getData(double time);
 
        
};
 
        
#endif // MAINWINDOW_H
在此作者的基礎上做了一些備注與修改:
https://blog.csdn.net/HiccupHiccup/article/details/74996618


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM