QChart 多线程
时间: 2025-01-01 19:30:21 浏览: 5
### 使用 QChart 实现多线程更新图表
为了实现在 `QChart` 中通过多线程来动态更新图表,可以采用一种常见的设计模式——生产者/消费者模型。具体来说,在后台工作线程中计算数据点,并将这些新获取的数据传递给主线程中的 `QChartView` 或 `QChart` 对象进行显示。
#### 创建 Worker 类处理耗时任务
首先创建一个继承自 `QObject` 的 worker 类用于执行实际的任务逻辑:
```cpp
// myworker.h
#ifndef MYWORKER_H
#define MYWORKER_H
#include <QObject>
#include <QDebug>
class MyWorker : public QObject {
Q_OBJECT
public slots:
void doWork() {
while (true) { // 模拟持续工作的循环
double value = /* 计算新的数值 */;
emit resultReady(value);
QThread::msleep(100); // 控制频率
if(stopFlag){
break;
}
}
}
signals:
void resultReady(double value);
private:
bool stopFlag=false;
public:
void setStop(bool flag){stopFlag=flag;}
};
#endif // MYWORKER_H
```
此代码片段展示了如何在一个单独的工作进程中不断生成随机数并通过信号通知主界面有可用的新数据[^1]。
#### 主窗口类集成 QChart 和多线程支持
接着修改主窗口类以便它可以启动上述工作者对象并将接收到的结果应用到图表上:
```cpp
// mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow),
m_chart(new QChart()), series(new QSplineSeries()) {
setupUi(this);
chart->legend()->hide();
chart->addSeries(series);
chart->createDefaultAxes();
chartView.setRenderHint(QPainter::Antialiasing);
chartView.setChart(chart);
auto thread = new QThread{};
auto worker = new MyWorker{};
connect(worker, &MyWorker::resultReady,
this, [&](double val){
static int pointIndex = 0;
series->append(pointIndex++, val);
chart->scrollTo(val, Qt::AlignRight | Qt::AlignBottom);
});
connect(thread, &QThread::started, worker, &MyWorker::doWork);
connect(thread, &QThread::finished, worker, &QObject::deleteLater);
worker->moveToThread(thread);
thread->start();
}
MainWindow::~MainWindow(){
qobject_cast<MyWorker*>(sender())->setStop(true);
}
```
这里实现了当接收到由 `MyWorker` 发送过来的最新测量值时自动将其追加至折线图序列末端的功能[^2]。
此外还设置了滚动效果使得每次添加新点之后视窗都会随之移动保持最新的几个样本始终可见[^3]。
阅读全文