写一段在qwidget中实时显示折线图的代码
时间: 2024-03-16 11:42:12 浏览: 44
以下是一个在 QWidget 中实时显示折线图的示例代码:
```cpp
#include <QtWidgets>
class RealtimeLineChart : public QWidget
{
public:
RealtimeLineChart(QWidget *parent = nullptr) : QWidget(parent)
{
// 创建折线图对象
m_chart = new QChart();
m_chart->legend()->hide(); // 隐藏图例
// 创建折线序列对象
m_series = new QLineSeries();
m_chart->addSeries(m_series);
// 设置坐标轴
m_axis_x = new QValueAxis();
m_axis_x->setLabelFormat("%d"); // 设置 X 轴标签格式
m_axis_x->setRange(0, 100); // 设置 X 轴范围
m_chart->addAxis(m_axis_x, Qt::AlignBottom);
m_series->attachAxis(m_axis_x);
m_axis_y = new QValueAxis();
m_axis_y->setLabelFormat("%d"); // 设置 Y 轴标签格式
m_axis_y->setRange(0, 100); // 设置 Y 轴范围
m_chart->addAxis(m_axis_y, Qt::AlignLeft);
m_series->attachAxis(m_axis_y);
// 创建图表视图对象
m_chart_view = new QChartView(m_chart, this);
m_chart_view->setRenderHint(QPainter::Antialiasing); // 抗锯齿
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(m_chart_view);
// 定时器,用于定时更新折线图数据
m_timer = new QTimer(this);
connect(m_timer, &QTimer::timeout, this, &RealtimeLineChart::updateData);
m_timer->start(100); // 每隔 100ms 更新一次折线图数据
}
private:
QChart *m_chart;
QLineSeries *m_series;
QValueAxis *m_axis_x;
QValueAxis *m_axis_y;
QChartView *m_chart_view;
QTimer *m_timer;
void updateData()
{
static int x = 0;
int y = qrand() % 100; // 生成 0~99 之间的随机数
m_series->append(x++, y);
m_axis_x->setRange(qMax(0, x - 100), x); // X 轴范围滚动
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
RealtimeLineChart chart;
chart.resize(400, 300);
chart.show();
return a.exec();
}
```
该示例代码中,我们创建了一个 `RealtimeLineChart` 类,它继承自 QWidget,用于在 QWidget 中实时显示折线图。在 `RealtimeLineChart` 的构造函数中,我们创建了一个 QChart 对象和一个 QLineSeries 对象,并将 QLineSeries 对象添加到 QChart 对象中,最后创建了一个 QChartView 对象用于显示 QChart。同时,我们还创建了一个 QTimer 对象用于定时更新折线图数据。在 `updateData()` 函数中,我们生成一个 0~99 之间的随机数,并将其作为新的数据点添加到 QLineSeries 对象中。最后,我们还对 X 轴范围进行了滚动,保证了折线图中始终显示最新的 100 个数据点。