QChart 多線程實現動態波形圖表

Qt5.9.6 不能使用前置聲明QLineSeries,需要在頭文件中包含#include <QtCharts>,否則報錯,應該是因爲QLineSeries 在命名空間導致的

# mainwindow.cpp
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    series = new QLineSeries(this);
    //開啓openGL
    series->setUseOpenGL(true);
    chart = new QChart();
    //添加線條
    chart->addSeries(series);
    //自動縮放
    chart->createDefaultAxes();
    //設置範圍
    chart->axisY()->setRange(-10, 10);
    chart->axisX()->setRange(0, maxSize);
    //設置軸上字體
    chart->axisX()->setTitleText("Time/sec");
    chart->axisY()->setTitleText("Speed/m");
    //柵格不可見
    chart->axisX()->setGridLineVisible(false);
    chart->axisY()->setGridLineVisible(false);
    //隱藏圖例
    chart->legend()->hide();
    //添加chart 入view
    ui->chartView->setChart(chart);
    //反走樣
    ui->chartView->setRenderHint(QPainter::Antialiasing);

    work = new Work();
    QThread *thread = new QThread();
    work->moveToThread(thread);
    thread->start();
    connect(work, &Work::sendSeries, this, &MainWindow::slotUpdate);
    work->startInit();
}

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

void MainWindow::slotUpdate(QList<QPointF> data)
{
    series->replace(data);
}

# work.cpp
Work::Work(QObject *parent) : QObject(parent)
{    
    qRegisterMetaType<QList<QPointF>>("QList<QPointF>");
    connect(this, &Work::startInit, this, &Work::slotStartInit);
}

void Work::slotStartInit()
{
    timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, &Work::processData);
    //開始定時器,定時刷新數據
    timer->start(5);
}

void Work::processData()
{
    //添加最新的數據到最後面
    data.append(QPointF(count , 10 * sin(M_PI * count * 4 / 180)));
    //刪除第一個數據,以保證數據個數不會超出最大範圍
    if (data.size() >= maxSize) {
        data.removeFirst();
    }
    QList<QPointF> _data;
    //將數據向x軸左移
    for(int loop = 0; loop < data.count(); loop++) {
        _data.append(QPointF(loop, data.at(loop).y()));
    }

    count++;
    //發送處理後的數據出去
    emit sendSeries(_data);
}

源文件地址

後期需求改動,功能增加,需要滾輪縮放波形,鼠標點擊拖動曲線,下面是工程地址:
新工程地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章