一、畫曲線
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; }