QCustomPlot-在customPlot下方的QCPAxisRect上显示项目

QCustomPlot - show item on QCPAxisRect below customPlot

本文关键字:QCPAxisRect 显示 项目 customPlot QCustomPlot-      更新时间:2023-10-16

在一个类似QCustomPlot财务演示的项目中,我不仅想在图表区域中绘制QCPItemRect,还想在图表下方的区域中绘制。

具有

QCPAxisRect *   xRect = new QCPAxisRect( this->ui.customPlot )
...
this->ui.customPlot->plotLayout()->addElement(1, 0, xRect);          

我想添加类似的QCPItemRect

QCPItemRect *    xItem = new QCPItemRect( this->ui.customPlot );
                 xItem -> setPen   ( QPen ( Qt::black ));
                 xItem -> bottomRight ->setAxisRect( this->xRect );
                 xItem -> topLeft     ->setAxisRect( this->xRect );
                 xItem -> bottomRight ->setCoords(x - 2.0, y - 2.0);
                 xItem -> topLeft     ->setCoords(x + 2.0, y + 2.0);
                 this->ui.customPlot->addItem( xItem );

然而,与this->xRect相反,矩形仍然绘制在this->ui.customPlot上。为什么?

非常感谢您的帮助,Daniel

更新我自己找到了答案的一部分,缺少的一行代码是

xItem -> setClipAxisRect( xRect )

仍然只适用于某些QCPAxisRects。

更新2仍然没有。以下是再现行为的最小代码片段,足以将其粘贴到一个空的QCustomPlot项目中:

// create a rectAxis, put it below the main plot
QCPAxisRect *   xRect = new QCPAxisRect( this->ui.customPlot );
                this->ui.customPlot->plotLayout()->addElement( 1, 0, xRect );
// create a rectItem and show it on the xRect    
QCPItemRect *   xRectItem = new QCPItemRect( this->ui.customPlot );
                xRectItem->setVisible          (true);
                xRectItem->setPen              (QPen(Qt::transparent));
                xRectItem->setBrush            (QBrush(Qt::lightGray));
                xRectItem->topLeft     ->setType(QCPItemPosition::ptPlotCoords);
                xRectItem->topLeft     ->setAxisRect( xRect );
                xRectItem->topLeft     ->setCoords( 1, 4 );
                xRectItem->bottomRight ->setType(QCPItemPosition::ptPlotCoords);
                xRectItem->bottomRight ->setAxisRect( xRect );
                xRectItem->bottomRight ->setCoords( 2, 1 );
                xRectItem->setClipAxisRect     ( xRect );
                xRectItem->setClipToAxisRect   ( false );       // XXX
                this->ui.customPlot->replot();[/code]

行为取决于"XXX"行是否被注释掉

  1. 行注释掉了-矩形根本不会出现
  2. 中的左线-矩形被绘制到主矩形中,如图所示

非常感谢任何提示,Daniel

找到了答案(感谢QCustomPlot的作者)。缺少的组件是

  1. 设置矩形的clipAxisRect(已包含在问题的上次更新中)
  2. 设置矩形所遵循的轴

具体而言,

 xRectItem->setClipAxisRect     ( xRect );

 xRectItem->topLeft     ->setAxes( xRect->axis(QCPAxis::atBottom), xRect->axis(QCPAxis::atLeft) );
 xRectItem->bottomRight ->setAxes( xRect->axis(QCPAxis::atBottom), xRect->axis(QCPAxis::atLeft) );