2015-04-04 13 views
11

In einem Projekt ähnlich the QCustomPlot financial demo möchte ich ein QCPItemRect nicht nur in den Diagrammbereich, sondern auch in den Bereich unter dem Diagramm zeichnen.QCustomPlot - zeige Artikel auf QCPAxisRect unter customPlot

Nachdem

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

ich die QCPItemRect wie

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

jedoch hinzufügen möchten, wird das Rechteck noch auf this->ui.customPlot gezogen zu this->xRect gegenüber. Warum?

Jede Hilfe ist sehr geschätzt, Daniel

UPDATE ein Teil der Antwort selbst gefunden, ist eine fehlende Codezeile

xItem -> setClipAxisRect(xRect) 

Noch nur mit einigen QCPAxisRects funktioniert.

UPDATE 2 Immer noch nicht da. Im Folgenden ist der kleinste Code-Schnipsel, die das Verhalten reproduziert - sein genug, um es in ein leeres QCustomPlot Projekt einzufügen:

// 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] 

Das Verhalten hängt davon ab, ob die „XXX“ Zeile kommentiert oder nicht

  1. Zeile auskommentiert - das Rechteck erscheint nicht auf alle.
  2. Zeile übrig - das Rechteck wird in das Haupt-Rechteck gezogen, wie z. B. here.

Jeder Hinweis sehr geschätzt wird, Daniel

Antwort

5

die Antwort (Dank an den Autor von QCustomPlot) gefunden. Die fehlenden Komponenten waren

  1. Einstellungen der clipAxisRect des Rechtecks ​​(bereits in der letzten Aktualisierung der Frage enthält)
  2. Einstellungen der Achsen, die das Rechteck gehorcht.

Spezifisch

xRectItem->setClipAxisRect  (xRect); 

und

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