You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Qt框架中为折线图添加平滑效果?

Qt折线图实现平滑效果

方法一:使用QLineSeries自带的平滑属性

Qt的QLineSeries内置了折线平滑功能,只需调用setSmooth(true)即可快速实现基础平滑效果,无需额外计算,适合大多数简单场景。

修改后的代码示例

假设你原本的创建代码类似这样:

QLineSeries *series = new QLineSeries();
// 添加数据点
series->append(0, 5);
series->append(1, 2);
series->append(2, 7);
series->append(3, 3);

QChart *chart = new QChart();
chart->addSeries(series);
chart->createDefaultAxes();

只需添加一行代码启用平滑:

series->setSmooth(true); // 启用折线平滑

这种方式的平滑效果由Qt内部实现,曲线过渡自然,无需手动处理点坐标。

方法二:手动生成贝塞尔曲线实现自定义平滑

如果自带的平滑效果无法满足你的需求(比如需要更强烈的曲线过渡、自定义平滑程度),可以通过计算贝塞尔曲线的中间点来生成平滑折线。

平滑点计算函数示例

以下是一个实现三次贝塞尔曲线平滑的工具函数,可根据原始数据生成平滑后的系列:

#include <QLineSeries>
#include <QPointF>

static QLineSeries* createSmoothSeries(const QLineSeries* originalSeries) {
    QLineSeries* smoothSeries = new QLineSeries();
    QList<QPointF> points = originalSeries->points();
    int count = points.size();

    if (count < 3) {
        // 数据点过少无需平滑,直接返回原数据
        *smoothSeries << points;
        return smoothSeries;
    }

    // 添加第一个点
    smoothSeries->append(points.first());

    for (int i = 1; i < count - 1; ++i) {
        QPointF p0 = points[i-1];
        QPointF p1 = points[i];
        QPointF p2 = points[i+1];

        // 计算贝塞尔控制点,可调整系数0.3来改变平滑程度
        qreal controlFactor = 0.3;
        QPointF c1 = QPointF(p1.x() - (p2.x() - p0.x()) * controlFactor,
                             p1.y() - (p2.y() - p0.y()) * controlFactor);
        QPointF c2 = QPointF(p1.x() + (p2.x() - p0.x()) * controlFactor,
                             p1.y() + (p2.y() - p0.y()) * controlFactor);

        // 生成贝塞尔曲线上的中间点(这里取10个点保证平滑度)
        for (qreal t = 0; t < 1; t += 0.1) {
            qreal x = (1-t)*(1-t)*(1-t)*p1.x() + 3*(1-t)*(1-t)*t*c1.x() + 3*(1-t)*t*t*c2.x() + t*t*t*p2.x();
            qreal y = (1-t)*(1-t)*(1-t)*p1.y() + 3*(1-t)*(1-t)*t*c1.y() + 3*(1-t)*t*t*c2.y() + t*t*t*p2.y();
            smoothSeries->append(x, y);
        }
    }

    // 添加最后一个点
    smoothSeries->append(points.last());
    return smoothSeries;
}

使用方式

在你的图表创建代码中,用平滑后的系列替换原系列:

QLineSeries *originalSeries = new QLineSeries();
originalSeries->append(0, 5);
originalSeries->append(1, 2);
originalSeries->append(2, 7);
originalSeries->append(3, 3);

// 生成平滑系列
QLineSeries *smoothSeries = createSmoothSeries(originalSeries);

QChart *chart = new QChart();
chart->addSeries(smoothSeries);
chart->createDefaultAxes();

// 记得释放原系列内存(如果不需要保留的话)
delete originalSeries;

注意事项

  • 调整controlFactor系数可以改变平滑程度:值越大,曲线越弯曲;值越小,越接近原始折线。
  • 生成的中间点数量越多,平滑效果越细腻,但会增加内存占用和绘制压力,大数据量时需适当调整步长(比如t += 0.2)。

内容的提问来源于stack exchange,提问作者Pomador

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 16:13:32