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);
}
後期需求改動,功能增加,需要滾輪縮放波形,鼠標點擊拖動曲線,下面是工程地址:
新工程地址