Подтвердить что ты не робот

QCustomPlot - показать элемент на QCPAxisRect ниже customPlot

В проекте, напоминающем финансовую демоверсию 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->ui.customPlot, а не на this->xRect. Зачем?

Любая помощь очень ценится, Daniel

UPDATE Я сам нашел часть ответа, одна недостающая строка кода

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" или нет

  • строка прокомментирована - прямоугольник не отображается ВСЕ.
  • строка слева - прямоугольник втягивается в основной прямоугольник, например, здесь.

Любой намек очень ценится, Daniel

4b9b3361

Ответ 1

Нашел ответ (спасибо автору QCustomPlot). Недостающими компонентами были

  • Устанавливает clipAxisRect прямоугольника (уже содержащегося в последнем обновлении вопроса)
  • Настройка осей, которым подчиняется прямоугольник.

В частности,

 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) );