QCustomPlot学习(2)

点击图例隐藏曲线

    • 效果图
    • 代码部分
    • 参考博客

在使用示波器进行各类调试的时候,我觉得隐藏曲线这一功能还是十分实用的,所以下面对这一功能的实现做一个简单的讲述。

效果图

全显波形:
QCustomPlot学习(2)_第1张图片
左键CH1图例后隐藏红线:
QCustomPlot学习(2)_第2张图片

代码部分

首先在源码中找到图例点击信号,即:void legendClick(QCPLegend *legend, QCPAbstractLegendItem *item, QMouseEvent *event); 查看.c文件可以找到如下代码(为避免影响阅读,我删除了该函数中的部分代码):

void QCustomPlot::mouseReleaseEvent(QMouseEvent *event)
{
  emit mouseRelease(event);
  /*-------------------------此处省略若干行--------------------------*/
    } else if (QCPAxis *ax = qobject_cast(mMouseSignalLayerable))
      emit axisClick(ax, mMouseSignalLayerableDetails.value(), event);
    else if (QCPAbstractItem *ai = qobject_cast(mMouseSignalLayerable))
      emit itemClick(ai, event);
    else if (QCPLegend *lg = qobject_cast(mMouseSignalLayerable))
      emit legendClick(lg, 0, event);

/*-----------------------------------------------------------------------------------------------------------*/
    else if (QCPAbstractLegendItem *li = qobject_cast(mMouseSignalLayerable))
      emit legendClick(li->parentLegend(), li, event);
/*-----------------------------------------------------------------------------------------------------------*/

    mMouseSignalLayerable = 0;
  }
  

上述代码中独立出来被框住的就是我们想要的了。其中 mMouseSignalLayerable 保存了click 事件发生的 position 所包含的层的信息。在源码中同样可以找到对 mMouseSignalLayerable 赋值部分的代码,在 Class QCustomPlot 的 mousePressEvent 函数中。具体代码如下:

void QCustomPlot::mousePressEvent(QMouseEvent *event)
{
  emit mousePress(event);
   /*-------------------------此处省略若干行--------------------------*/
    // no selection rect interaction, prepare for click signal emission and forward event to layerable under the cursor:
    QList details;
    QList candidates = layerableListAt(mMousePressPos, false, &details);
    if (!candidates.isEmpty())
    {
      mMouseSignalLayerable = candidates.first(); // candidate for signal emission is always topmost hit layerable (signal emitted in release event)
      mMouseSignalLayerableDetails = details.first();

/*-----------------------------------------------------------------------------------------------------------*/
	  if (qobject_cast(mMouseSignalLayerable)){	//add by IA at 05/25/2020
		  mMouseSignalLayerable = candidates.at(2);
		  mMouseSignalLayerableDetails = details.at(2);
	  }
/*-----------------------------------------------------------------------------------------------------------*/

    }
    // forward event to topmost candidate which accepts the event:
    for (int i=0; iaccept(); // default impl of QCPLayerable's mouse events call ignore() on the event, in that case propagate to next candidate in list
      candidates.at(i)->mousePressEvent(event, details.at(i));
      if (event->isAccepted())
      {
        mMouseEventLayerable = candidates.at(i);
        mMouseEventLayerableDetails = details.at(i);
        break;
      }
    }
  }

这里可以看到 mMouseSignalLayerable 被赋值为 candidates 的第一个元素。但是从效果图中可以看到我是加了 Tracer 的,且 Tracer 绘制在 “overlay” 层,所以正常情况下每次点击后在 mouseReleaseEvent 函数中 emit 的信号是 itemClick(ai, event); 这个。为了解决这一问题,所以我在源码中加入了上述被框住的代码,因为我觉得我用不到 itemClick 这个信号(很显然,这种做法十分的low;所以如果有同学有好的办法,欢迎交流指教)。这样在 mouseReleaseEvent 函数中,就会 emit legendClick 了。后面只需再写个槽函数,隐藏对应曲线即可。
/--------------------------------------------------------------------------------------/
如果未在 “overlay” 层绘制图形,或者在 click legend 的时候鼠标不会点到 “overlay” 层的图形(比如我的十字光标在 click legend 的时候 visible 为false),那么可以忽略 mousePressEvent 函数的这部分。

最后实现 graph 隐藏部分的代码如下:

void myCustomPlot::hidegraph(QCPLegend *legend, QCPAbstractLegendItem *item, QMouseEvent *event)
{
	if (event->button() == Qt::LeftButton){
		for (int i = 0; i < m_Plot->graphCount(); ++i)
		{
			/*if ((legend->item(i) == item) && (item->selected())){*/
			if (legend->item(i) == item){
				if (m_Plot->graph(i)->visible() == true){
					m_Plot->graph(i)->setVisible(false);
				}
				else if (m_Plot->graph(i)->visible() == false){
					m_Plot->graph(i)->setVisible(true);
				}
				m_Plot->currentLayer()->replot();
			}
		}
	}
}

参考博客

1、https://blog.csdn.net/bing_lee/category_8726610.html
2、https://blog.csdn.net/qq10097355/category_9801691.html
3、https://www.cnblogs.com/swarmbees/category/908110.html
4、https://blog.csdn.net/qq_31073871/category_8935784.html

你可能感兴趣的:(QCustomPlot学习)