版权声明:未经许可,请勿转载! https://blog.csdn.net/weixin_37204973/article/details/82468544
看了网上几个例子,照着做,发现数据量大的时候,有点卡,所以这里使用双线程来做
# 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);
}
需求改动,功能增加,需要通过滚轮缩放波形,鼠标点击拖动曲线,代码里面有注释,就不在这里啰嗦了,
下面是工程地址
新工程地址