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

