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
相关产品推荐
相关产品推荐

