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

QWT图例未匹配曲线符号问题求助(QT5.15环境)

QWT图例符号与曲线符号不匹配问题解决

我正在使用QT 5.15搭配QWT创建绘图,已为绘图添加图例,但图例中各条目的颜色正确,符号却始终显示为方形,而非曲线所使用的对应符号。

绘图初始化代码

ui->setupUi(this);

m_qwtp = new QwtPlot(this);
ui->verticalLayout->insertWidget(0, m_qwtp);
setAttribute(Qt::WA_DeleteOnClose);

// 设置图表标题
QwtText title("温度变化历史");
title.setFont(QFont("sans", 14, QFont::Bold));
m_qwtp->setTitle(title);

// 参考qwt_axis.h的Position枚举对应关系
// 2 = 底部X轴,0 = 左侧Y轴
m_qwtp->setAxisTitle(QwtAxis::Position::XBottom, "时间 [秒]");
m_qwtp->setAxisTitle(QwtAxis::Position::YLeft, "温度 [K]");
m_qwtp->setAxisScale(QwtAxis::Position::YLeft, 0.9 * tempMinimum,
                     1.1 * tempMaximum, 0.0);

m_qwtp->insertLegend(new QwtLegend());

添加曲线的方法代码

void addPlot(double depth, int plotCount, QVector<double>& QTimes, QVector<double>& QTemps)
{
    // 设置X轴刻度(所有曲线共用,重复设置不影响)
    m_qwtp->setAxisScale(QwtAxis::Position::XBottom, QTimes.first(),
                         1.075 * QTimes.last(), 0.0);

    // 创建新曲线并设置标题
    QwtPlotCurve* curve = new QwtPlotCurve();
    curve->setTitle(QString("深度%1 cm处区域").arg(depth));

    // 添加数据点
    QPolygonF points;
    for (int i = 0; i < QTimes.size(); i++)
    {
        points << QPointF(QTimes[i], QTemps[i]);
    }
    curve->setSamples(points);

    // 为每条曲线设置唯一颜色
    QColor color(qSin(plotCount * 1.1 + 1.2) * 80 + 80,
                 qSin(plotCount * .3) * 80 + 80,
                 qSin(plotCount * 0.3 + 1.7) * 80 + 80);

    QPen pen;
    pen.setColor(color);
    pen.setWidth(2);
    pen.setStyle(Qt::SolidLine);

    curve->setPen(pen);
    curve->setRenderHint(QwtPlotItem::RenderAntialiased, true);

    // 根据plotCount选择不同符号,循环使用15种样式保证区分度
    QwtSymbol* symbol;
    if (plotCount % 15 == 0)
    {
        symbol = new QwtSymbol(QwtSymbol::Ellipse, QBrush(color), pen, QSize(10, 10));
    }
    else if (plotCount % 15 == 1)
    {
        symbol = new QwtSymbol(QwtSymbol::Rect, QBrush(color), pen, QSize(10, 10));
    }
    else if (plotCount % 15 == 2)
    {
        symbol = new QwtSymbol(QwtSymbol::Diamond, QBrush(color), pen, QSize(10, 10));
    }
    else if (plotCount % 15 == 3)
    {
        symbol = new QwtSymbol(QwtSymbol::Triangle, QBrush(color), pen, QSize(10, 10));
    }
    else if (plotCount % 15 == 4)
    {
        symbol = new QwtSymbol(QwtSymbol::DTriangle, QBrush(color), pen, QSize(10, 10));
    }
    else if (plotCount % 15 == 5)
    {
        symbol = new QwtSymbol(QwtSymbol::UTriangle, QBrush(color), pen, QSize(10, 10));
    }
    else if (plotCount % 15 == 6)
    {
        symbol = new QwtSymbol(QwtSymbol::LTriangle, QBrush(color), pen, QSize(10, 10));
    }
    else if (plotCount % 15 == 7)
    {
        symbol = new QwtSymbol(QwtSymbol::RTriangle, QBrush(color), pen, QSize(10, 10));
    }
    else if (plotCount % 15 == 8)
    {
        symbol = new QwtSymbol(QwtSymbol::Cross, QBrush(color), pen, QSize(10, 10));
    }
    else if (plotCount % 15 == 9)
    {
        symbol = new QwtSymbol(QwtSymbol::XCross, QBrush(color), pen, QSize(10, 10));
    }
    else if (plotCount % 15 == 10)
    {
        symbol = new QwtSymbol(QwtSymbol::HLine, QBrush(color), pen, QSize(10, 10));
    }
    else if (plotCount % 15 == 11)
    {
        symbol = new QwtSymbol(QwtSymbol::VLine, QBrush(color), pen, QSize(10, 10));
    }
    else if (plotCount % 15 == 12)
    {
        symbol = new QwtSymbol(QwtSymbol::Star1, QBrush(color), pen, QSize(10, 10));
    }
    else if (plotCount % 15 == 13)
    {
        symbol = new QwtSymbol(QwtSymbol::Star2, QBrush(color), pen, QSize(10, 10));
    }
    else // plotCount %15 ==14
    {
        symbol = new QwtSymbol(QwtSymbol::Hexagon, QBrush(color), pen, QSize(10, 10));
    }

    curve->setSymbol(symbol);
    // --- 新增解决代码 ---
    curve->setLegendAttribute(QwtPlotCurve::LegendShowSymbol);
    // --- 新增代码结束 ---

    curve->attach(m_qwtp);
    m_qwtp->replot();
}

解决方案

问题根源是QwtPlotCurve默认不会在图例中显示曲线符号,只需在设置曲线符号后添加一行代码,开启图例显示符号的属性:

curve->setLegendAttribute(QwtPlotCurve::LegendShowSymbol);

添加后,图例将同步显示曲线对应的符号样式,不再是统一的方形。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 12:12:03