QChart 繪制實時曲線


一、畫曲線

 

 

 

 1.1畫直線QLineSeries

   QLineSeries m_series ;
   QPen green(Qt::red);
   green.setWidth(2);
   m_series.setPen(green);
 m_series.append(m_x, m_y); //向曲線添加數據
 

 

 

 

1.2畫弧線QSplineSeries

 

 

 

二、畫坐標

 

 

 

 2.1數字量坐標QValueAxis  (用的廣泛)

 

    QValueAxis *axisX = new QValueAxis; //建議使用動態分配的方式
 axisX->setRange(0, 2000);       //設置坐標范圍
    axisX->setLabelFormat("%g");     //設置坐標顯示格式(比如整形%d %i,浮點型%f)
    axisX->setTitleText("Samples"); //設置坐標標題
    axisX->setTickCount(5);    //設置網格數量,5根線,四個網格

 

 
        

 

2.2時間日期坐標 QDateTimeAxis

 

 

 

 

    QDateTimeAxis *axisX = new QDateTimeAxis;
    axisX->setTickCount(10);
    axisX->setFormat("MMM yyyy"); //設置以月年格式顯示
    axisX->setTitleText("Date");

 

 

三、畫整體圖表QChart

 

    QChart *chart = new QChart();
    chart->addSeries(series); //把曲線添加到圖表
    chart->setTitle("Sunspots count (by Space Weather Prediction Center)"); //設置大標題
   chart->setAxisX(axisX,series); //把坐標添加上

 

 
        

四、顯示圖表 QChartView 

 

  QChartView *chartView = new QChartView(chart); //把圖標添加到圖標顯示控件上
   QMainWindow window;
    window.setCentralWidget(chartView); //把顯示控件放到主窗口中心
   window.show();

 

 

五、更新曲線

 

 5.1追加的方式更新

 m_series.append(m_x, m_y);

 

 5.2整體刷新

 m_series->replace(m_buffer);

 

 

六、動態顯示

 

 

 

    qreal dwidth= chart.plotArea().width()/(m_axis.tickCount()*2); //一次滾動多少寬度
    qreal dx= 10/(m_axis.tickCount()*2); //橫坐標偏移量

    m_x += dx;
    m_y=sin(m_x);
    m_series.append(m_x, m_y);

    /*滿屏之后滾動窗口*/
    if(m_x>10)
  chart.scroll(dwidth, 0); //dwidth 代表的窗口橫坐標方向滾動的區域大小
                             //dwidth 的單位不是橫坐標的單位,而是窗口像素

 

 七、代碼:

 參考:https://blog.csdn.net/mars_xiaolei/article/details/85242869  非常感謝這位博主

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QTime"
#include "QDebug"
#include "qmath.h"
#include "QValueAxis"
#include "QDateTimeAxis"
#include "QRandomGenerator"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setWindowTitle("動態正弦波形圖");
    connect(&m_timer,SIGNAL(timeout()),this,SLOT(RealtimeDataSlot()));
    m_timer.setInterval(1000);
    m_x=0;
    m_y=0;

    chart.setTheme(QChart::ChartThemeDark);//設置系統主題
    chart.setTitle("動態正弦波形圖");//設置標題
    chart.setTitleFont(QFont("微軟雅黑",10));
    chart.legend()->hide();


    QPen green(Qt::red);
    green.setWidth(2);
    m_series.setPen(green);
    m_series.append(m_x, m_y);

    chart.addSeries(&m_series);
    chart.createDefaultAxes();
    chart.setAxisX(&m_axis,&m_series);
    m_axis.setTickCount(5);
    chart.axisX()->setRange(0,10);
    chart.axisY()->setRange(-1, 1);



    QChartView *chartView = new QChartView(&chart);
    QGridLayout *baseLayout = new QGridLayout(); //便於顯示,創建網格布局

    chartView->setRenderHint(QPainter::Antialiasing);

    baseLayout->addWidget(chartView, 0, 0);
    ui->widgetWaveForm->setLayout(baseLayout); //顯示到QWidget控件

    m_timer.start();
}
void MainWindow::RealtimeDataSlot()
{
    qreal dwidth= chart.plotArea().width()/(m_axis.tickCount()*2); //一次滾動多少寬度
    qreal dx= 10/(m_axis.tickCount()*2); //橫坐標偏移量

    m_x += dx;
    m_y=sin(m_x);
    m_series.append(m_x, m_y);

    /*滿屏之后滾動窗口*/
    if(m_x>10)
    chart.scroll(dwidth, 0); //dwidth 代表的窗口橫坐標方向滾動的區域大小
                             //dwidth 的單位不是橫坐標的單位,而是窗口像素

}
MainWindow::~MainWindow()
{
    delete ui;
}

 


免責聲明!

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



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