1. 多坐标系—单个游标—游标在多个坐标系切换
在某些场景下,需要动态的添加多个坐标系,而游标只能在一个坐标系中显示,这时就需要将游标从默认的坐标系切换到指定坐标系,实现很简单,就不贴图了。代码如下:
tracer->setClipAxisRect(Rect); //! QCPItemTracer* QCPAxisRect*
tracerLabel->setClipAxisRect(Rect); //! QCPItemText*
2.多坐标系—单个游标—游标贯穿多个坐标系
我的另一篇文章有过大概介绍,但是存在一些bug和一些繁琐的逻辑,最近做了些优化,有时间再更新下,这里大概描述下思路:
- 继承qcustomplot(可以不继承,根据自己需要,单纯为了方便)
- 创建 游标QCPItemTracer* 和 游标标签QCPItemText*,不绑定图层group,运行时编译器会输出:
virtual QPointF QCPItemPosition::pixelPosition() const Item position type x is ptPlotCoords, but no axes were defined
这是由于未绑定图层导致的,不影响运行。 - qcustomplot 提供了一个默认的图层,将图层样式改成需要的样式(为了好看,根据需要添加这一步)
- 添加图层,最重要部分,在首次添加图层时删除默认图层,一定是将第一个图层添加到
plotLayout()
中后再删除默认图层(plotLayout()
也就是m_plot->plotLayout()
); 删除坐标系用remove(),会将对象delete并nullptr; - 隐藏不需要的轴
- 关联各个图层的X轴,每添加一个坐标系,就与已有的坐标系建立connect(…),注意双向建立;删除坐标系前与其他的坐标系双向disconnect(个人需要)
QCPLegend
,下图右上角部件,legend是默认添加在qcustomplot默认的坐标系的insertLayout()对象里,而默认坐标系会在添加第一个坐标系后被删除,而在删除默认坐标系的同时,legend将被delete为nullptr;所以在添第一个坐标系的时候将legend添加到指定的坐标系 , 注意:此处的第一个坐标系与之前的不同,指的是除默认的自带的坐标系,每次向qcustomplot中添加的坐标系是其中第一个坐标系
在我们删除坐标系时,注意删除的坐标系是否是绑定了legend的坐标系,如果是 ,用take()
,该函数只会将legend从布局中移出,并不会delete,然后再删除坐标系,并将legend放入其他坐标系。QCustomPlot::mouseMove
QCustomPlot::mousePress
QCustomPlot::mouseRelease
QCustomPlot::selectionChangedByUser
QCustomPlot::legendDoubleClick
等信号操作就不做赘述了
3. 多坐标系—多个游标—一一对应
这个网上案例很多,就不做叙述了