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

Qt Creator中QtCharts绘制雷达点时如何隐藏自动生成的图例

解决QtCharts雷达图绘制点时生成大量图例的问题

问题描述

我用Qt Creator 6.3开发带GUI的雷达程序,通过QtCharts/QScatterSeries库在雷达组件上绘制点。但每绘制一个点,图表上方就会生成一个名为“series”的对应颜色图例;不添加图例就无法完成绘制。现在测试时已多次调用绘图函数,未来会在循环中调用超4000次,届时会出现大量图例的问题,求隐藏这些图例的方法。

绘图函数代码如下:

void RadarGUI::plotear_punto(int fila, int columna, int color){
    // 绘制单个点的函数

    QScatterSeries *punto= new QScatterSeries;  // 创建点对应的系列
    punto->setColor(QColor(255,0,0));
    punto->setMarkerSize(10);   
    punto->setBorderColor(QColor(0,0,0));  
    grafPol->addSeries(punto);   // 将系列添加到雷达组件,grafPol是雷达控件

    // 将系列关联到雷达控件的坐标轴
    punto->attachAxis(radialAxis);  
    punto->attachAxis(angularAxis);

    // 为点分配颜色
    switch (color) {
    case 1:
        punto->setColor(QColor(255,0,0));
        break;
    case 2:
        punto->setColor(QColor(0,255,0)); // 绿色
        break;
    case 3:
        punto->setColor(QColor(255,0,0));  // 红色
        break;
    case 4:
        punto->setColor(QColor(0,0,255)); // 蓝色
        break;
    case 5:
        punto->setColor(QColor(255,255,0));  // 黄色
        break;
    default:
        break;
    }

    // 计算点的坐标并绘制
    float angulo = (fila*360)/nfilas;
    float distancia = (columna*80)/ncolumnas;
    punto->append(angulo,distancia);
}

解决方案

1. 隐藏单个系列的图例

QtCharts的QAbstractSeries类提供了setVisibleInLegend方法,直接设置每个点对应的系列不显示图例即可。在创建punto系列后添加这行代码:

QScatterSeries *punto= new QScatterSeries;
punto->setVisibleInLegend(false); // 隐藏当前系列的图例项
// 后续颜色、大小等设置代码...

2. 隐藏整个图表的图例

如果不需要任何图例,直接禁用雷达图表的图例显示,一次设置即可生效:

// 在雷达控件初始化时添加,比如构造函数中
grafPol->legend()->hide();

3. 优化:复用系列绘制多点(推荐)

当前代码每个点创建一个系列,不仅会生成大量图例,还会占用过多内存、影响性能。建议按颜色分组,提前创建对应颜色的系列,后续只往系列中追加点:

步骤1:在类中声明系列成员变量

// RadarGUI类的头文件中添加
private:
    QScatterSeries *redSeries;
    QScatterSeries *greenSeries;
    QScatterSeries *blueSeries;
    QScatterSeries *yellowSeries;

步骤2:初始化系列(构造函数中)

RadarGUI::RadarGUI(QWidget *parent) : QWidget(parent)
{
    // 初始化红色系列
    redSeries = new QScatterSeries(this);
    redSeries->setColor(QColor(255,0,0));
    redSeries->setMarkerSize(10);
    redSeries->setBorderColor(QColor(0,0,0));
    redSeries->setVisibleInLegend(false);
    grafPol->addSeries(redSeries);
    redSeries->attachAxis(radialAxis);
    redSeries->attachAxis(angularAxis);

    // 初始化绿色系列
    greenSeries = new QScatterSeries(this);
    greenSeries->setColor(QColor(0,255,0));
    greenSeries->setMarkerSize(10);
    greenSeries->setBorderColor(QColor(0,0,0));
    greenSeries->setVisibleInLegend(false);
    grafPol->addSeries(greenSeries);
    greenSeries->attachAxis(radialAxis);
    greenSeries->attachAxis(angularAxis);

    // 初始化蓝色系列
    blueSeries = new QScatterSeries(this);
    blueSeries->setColor(QColor(0,0,255));
    blueSeries->setMarkerSize(10);
    blueSeries->setBorderColor(QColor(0,0,0));
    blueSeries->setVisibleInLegend(false);
    grafPol->addSeries(blueSeries);
    blueSeries->attachAxis(radialAxis);
    blueSeries->attachAxis(angularAxis);

    // 初始化黄色系列
    yellowSeries = new QScatterSeries(this);
    yellowSeries->setColor(QColor(255,255,0));
    yellowSeries->setMarkerSize(10);
    yellowSeries->setBorderColor(QColor(0,0,0));
    yellowSeries->setVisibleInLegend(false);
    grafPol->addSeries(yellowSeries);
    yellowSeries->attachAxis(radialAxis);
    yellowSeries->attachAxis(angularAxis);
}

步骤3:修改绘图函数

void RadarGUI::plotear_punto(int fila, int columna, int color){
    float angulo = (fila*360)/nfilas;
    float distancia = (columna*80)/ncolumnas;

    switch (color) {
    case 1:
    case 3:
        redSeries->append(angulo, distancia);
        break;
    case 2:
        greenSeries->append(angulo, distancia);
        break;
    case 4:
        blueSeries->append(angulo, distancia);
        break;
    case 5:
        yellowSeries->append(angulo, distancia);
        break;
    default:
        break;
    }
}

这种方式整个程序只有4个系列,彻底解决图例问题,同时大幅提升性能和内存利用率。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 13:56:39