#8452 QtCharts: Add fill color and pattern

This commit is contained in:
Kristian Bendiksen
2022-03-07 13:47:56 +01:00
parent 0bab8a9834
commit 72fc47e003
5 changed files with 118 additions and 19 deletions

View File

@@ -69,6 +69,7 @@ void RimPlotCurveAppearance::FillStyle::setUp()
addItem( Qt::BDiagPattern, "DIAG_FILL", "Diagonal Lines" ); addItem( Qt::BDiagPattern, "DIAG_FILL", "Diagonal Lines" );
addItem( Qt::CrossPattern, "CROSS_FILL", "Mesh" ); addItem( Qt::CrossPattern, "CROSS_FILL", "Mesh" );
addItem( Qt::DiagCrossPattern, "DIAG_CROSS_FILL", "Diagonal Mesh" ); addItem( Qt::DiagCrossPattern, "DIAG_CROSS_FILL", "Diagonal Mesh" );
setDefault( Qt::NoBrush );
} }
} // namespace caf } // namespace caf
@@ -386,6 +387,7 @@ void RimPlotCurveAppearance::resetAppearance()
setLineStyle( RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_SOLID ); setLineStyle( RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_SOLID );
setSymbol( RiuPlotCurveSymbol::SYMBOL_NONE ); setSymbol( RiuPlotCurveSymbol::SYMBOL_NONE );
setSymbolSkipDistance( 10 ); setSymbolSkipDistance( 10 );
setFillStyle( Qt::NoBrush );
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@@ -44,11 +44,16 @@ RiuQtChartsPlotCurve::RiuQtChartsPlotCurve( RimPlotCurve* ownerRimCurve, const Q
m_lineSeries = new QtCharts::QLineSeries(); m_lineSeries = new QtCharts::QLineSeries();
m_lineSeries->setName( title ); m_lineSeries->setName( title );
m_areaSeries = new QtCharts::QAreaSeries();
m_areaSeries->setName( title );
m_scatterSeries = new QtCharts::QScatterSeries(); m_scatterSeries = new QtCharts::QScatterSeries();
m_scatterSeries->setName( title ); m_scatterSeries->setName( title );
m_axisX = RiuPlotAxis::defaultBottom(); m_axisX = RiuPlotAxis::defaultBottom();
m_axisY = RiuPlotAxis::defaultLeft(); m_axisY = RiuPlotAxis::defaultLeft();
m_isVisibleInLegend = false;
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -69,6 +74,15 @@ RiuQtChartsPlotCurve::~RiuQtChartsPlotCurve()
delete line; delete line;
} }
auto* area = areaSeries();
if ( area )
{
m_plotWidget->qtChart()->removeSeries( area );
// removeSeries() releases chart ownership of the data, delete data to avoid memory leak
delete area;
}
auto* scatter = scatterSeries(); auto* scatter = scatterSeries();
if ( scatter ) if ( scatter )
{ {
@@ -83,6 +97,9 @@ RiuQtChartsPlotCurve::~RiuQtChartsPlotCurve()
delete m_lineSeries; delete m_lineSeries;
m_lineSeries = nullptr; m_lineSeries = nullptr;
delete m_areaSeries;
m_areaSeries = nullptr;
delete m_scatterSeries; delete m_scatterSeries;
m_scatterSeries = nullptr; m_scatterSeries = nullptr;
} }
@@ -95,6 +112,7 @@ void RiuQtChartsPlotCurve::setTitle( const QString& title )
if ( !isQtChartObjectsPresent() ) return; if ( !isQtChartObjectsPresent() ) return;
lineSeries()->setName( title ); lineSeries()->setName( title );
areaSeries()->setName( title );
scatterSeries()->setName( title ); scatterSeries()->setName( title );
} }
@@ -117,6 +135,22 @@ void RiuQtChartsPlotCurve::setAppearance( RiuQwtPlotCurveDefines::LineStyleEnum
lineSeries()->setPen( curvePen ); lineSeries()->setPen( curvePen );
lineSeries()->setBrush( fillBrush ); lineSeries()->setBrush( fillBrush );
areaSeries()->setPen( curvePen );
areaSeries()->setBrush( fillBrush );
if ( fillBrush.style() == Qt::NoBrush )
{
lineSeries()->show();
areaSeries()->hide();
setVisibleInLegend( m_isVisibleInLegend );
}
else
{
lineSeries()->hide();
areaSeries()->show();
setVisibleInLegend( m_isVisibleInLegend );
}
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -127,6 +161,7 @@ void RiuQtChartsPlotCurve::setBrush( const QBrush& brush )
if ( !isQtChartObjectsPresent() ) return; if ( !isQtChartObjectsPresent() ) return;
lineSeries()->setBrush( brush ); lineSeries()->setBrush( brush );
areaSeries()->setBrush( brush );
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -141,16 +176,19 @@ void RiuQtChartsPlotCurve::attachToPlot( RiuPlotWidget* plotWidget )
{ {
m_plotWidget->qtChart()->legend()->setMarkerShape( QtCharts::QLegend::MarkerShape::MarkerShapeFromSeries ); m_plotWidget->qtChart()->legend()->setMarkerShape( QtCharts::QLegend::MarkerShape::MarkerShapeFromSeries );
setVisibleInLegend( true ); setVisibleInLegend( true );
lineSeries()->show(); lineSeries()->show();
} }
else else
{ {
if ( !m_lineSeries ) m_lineSeries = new QtCharts::QLineSeries(); if ( !m_lineSeries ) m_lineSeries = new QtCharts::QLineSeries();
if ( !m_areaSeries ) m_areaSeries = new QtCharts::QAreaSeries();
if ( !m_scatterSeries ) m_scatterSeries = new QtCharts::QScatterSeries(); if ( !m_scatterSeries ) m_scatterSeries = new QtCharts::QScatterSeries();
m_plotWidget->attach( this, m_lineSeries, m_scatterSeries, m_axisX, m_axisY ); m_plotWidget->attach( this, m_lineSeries, m_areaSeries, m_scatterSeries, m_axisX, m_axisY );
// Plot widget takes ownership. // Plot widget takes ownership.
m_lineSeries = nullptr; m_lineSeries = nullptr;
m_areaSeries = nullptr;
m_scatterSeries = nullptr; m_scatterSeries = nullptr;
} }
@@ -181,6 +219,12 @@ void RiuQtChartsPlotCurve::detach()
line->hide(); line->hide();
} }
QtCharts::QAreaSeries* area = areaSeries();
if ( area )
{
area->hide();
}
if ( scatterSeries() ) if ( scatterSeries() )
{ {
scatterSeries()->hide(); scatterSeries()->hide();
@@ -210,8 +254,6 @@ void RiuQtChartsPlotCurve::setSamplesInPlot( const std::vector<double>& xValues,
CAF_ASSERT( xValues.size() == yValues.size() ); CAF_ASSERT( xValues.size() == yValues.size() );
QtCharts::QLineSeries* line = lineSeries();
QVector<QPointF> values( static_cast<int>( xValues.size() ) ); QVector<QPointF> values( static_cast<int>( xValues.size() ) );
for ( int i = 0; i < static_cast<int>( xValues.size() ); i++ ) for ( int i = 0; i < static_cast<int>( xValues.size() ); i++ )
@@ -219,8 +261,13 @@ void RiuQtChartsPlotCurve::setSamplesInPlot( const std::vector<double>& xValues,
values[i] = QPointF( xValues[i], yValues[i] ); values[i] = QPointF( xValues[i], yValues[i] );
} }
QtCharts::QLineSeries* line = lineSeries();
line->replace( values ); line->replace( values );
QtCharts::QLineSeries* upper = new QtCharts::QLineSeries;
upper->replace( values );
areaSeries()->setUpperSeries( upper );
updateScatterSeries(); updateScatterSeries();
} }
@@ -344,6 +391,7 @@ void RiuQtChartsPlotCurve::setXAxis( RiuPlotAxis axis )
if ( m_plotWidget ) if ( m_plotWidget )
{ {
m_plotWidget->setXAxis( axis, lineSeries(), this ); m_plotWidget->setXAxis( axis, lineSeries(), this );
m_plotWidget->setXAxis( axis, areaSeries(), this );
m_plotWidget->setXAxis( axis, scatterSeries(), this ); m_plotWidget->setXAxis( axis, scatterSeries(), this );
} }
} }
@@ -357,6 +405,7 @@ void RiuQtChartsPlotCurve::setYAxis( RiuPlotAxis axis )
if ( m_plotWidget ) if ( m_plotWidget )
{ {
m_plotWidget->setYAxis( axis, lineSeries(), this ); m_plotWidget->setYAxis( axis, lineSeries(), this );
m_plotWidget->setYAxis( axis, areaSeries(), this );
m_plotWidget->setYAxis( axis, scatterSeries(), this ); m_plotWidget->setYAxis( axis, scatterSeries(), this );
} }
} }
@@ -428,23 +477,21 @@ void RiuQtChartsPlotCurve::setVisibleInLegend( bool isVisibleInLegend )
if ( !m_plotWidget->qtChart()->legend()->isAttachedToChart() ) isVisibleInLegend = false; if ( !m_plotWidget->qtChart()->legend()->isAttachedToChart() ) isVisibleInLegend = false;
if ( !m_plotWidget->qtChart()->legend()->isVisible() ) isVisibleInLegend = false; if ( !m_plotWidget->qtChart()->legend()->isVisible() ) isVisibleInLegend = false;
bool showScatterMarker = isVisibleInLegend; bool showScatterMarker = isVisibleInLegend && m_symbol;
if ( !m_symbol ) showScatterMarker = false; bool showLineMarker = isVisibleInLegend && !m_symbol;
if ( scatterSeries() ) auto setLegendVisibility = [this]( auto series, bool isVisible ) {
{ if ( series )
auto markers = m_plotWidget->qtChart()->legend()->markers( scatterSeries() ); {
if ( !markers.isEmpty() ) markers[0]->setVisible( showScatterMarker ); auto markers = m_plotWidget->qtChart()->legend()->markers( series );
} if ( !markers.isEmpty() ) markers[0]->setVisible( isVisible );
}
};
bool showLineMarker = isVisibleInLegend; m_isVisibleInLegend = showLineMarker || showScatterMarker;
if ( showScatterMarker ) showLineMarker = false; setLegendVisibility( lineSeries(), showLineMarker );
setLegendVisibility( areaSeries(), false );
if ( lineSeries() ) setLegendVisibility( scatterSeries(), showScatterMarker );
{
auto lineSeriesMarkers = m_plotWidget->qtChart()->legend()->markers( lineSeries() );
if ( !lineSeriesMarkers.isEmpty() ) lineSeriesMarkers[0]->setVisible( showLineMarker );
}
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -469,6 +516,17 @@ QtCharts::QScatterSeries* RiuQtChartsPlotCurve::scatterSeries() const
return nullptr; return nullptr;
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QtCharts::QAreaSeries* RiuQtChartsPlotCurve::areaSeries() const
{
if ( m_areaSeries ) return m_areaSeries;
if ( m_plotWidget ) return dynamic_cast<QtCharts::QAreaSeries*>( m_plotWidget->getAreaSeries( this ) );
return nullptr;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -484,15 +542,29 @@ void RiuQtChartsPlotCurve::setSymbol( RiuPlotCurveSymbol* symbol )
{ {
qtChartsSymbol->applyToScatterSeries( scatterSeries() ); qtChartsSymbol->applyToScatterSeries( scatterSeries() );
updateScatterSeries(); updateScatterSeries();
updateLineAndAreaSeries();
} }
} }
else else
{ {
m_symbol.reset(); m_symbol.reset();
if ( scatterSeries() ) scatterSeries()->hide(); if ( scatterSeries() ) scatterSeries()->hide();
updateLineAndAreaSeries();
} }
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RiuQtChartsPlotCurve::updateLineAndAreaSeries()
{
bool isFilled = areaSeries() && areaSeries()->brush().style() != Qt::NoBrush;
bool isLine = lineSeries() && lineSeries()->pen().style() != Qt::PenStyle::NoPen;
if ( areaSeries() ) areaSeries()->setVisible( isFilled );
if ( lineSeries() ) lineSeries()->setVisible( isLine );
setVisibleInLegend( m_isVisibleInLegend );
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@@ -23,6 +23,7 @@
#include "cvfBoundingBox.h" #include "cvfBoundingBox.h"
#include <QAreaSeries>
#include <QLineSeries> #include <QLineSeries>
#include <QScatterSeries> #include <QScatterSeries>
@@ -76,6 +77,8 @@ public:
void setSymbol( RiuPlotCurveSymbol* symbol ) override; void setSymbol( RiuPlotCurveSymbol* symbol ) override;
void updateLineAndAreaSeries();
RiuPlotCurveSymbol* createSymbol( RiuPlotCurveSymbol::PointSymbolEnum symbol ) const override; RiuPlotCurveSymbol* createSymbol( RiuPlotCurveSymbol::PointSymbolEnum symbol ) const override;
void updateScatterSeries(); void updateScatterSeries();
@@ -89,14 +92,17 @@ private:
bool isQtChartObjectsPresent() const; bool isQtChartObjectsPresent() const;
QtCharts::QLineSeries* lineSeries() const; QtCharts::QLineSeries* lineSeries() const;
QtCharts::QScatterSeries* scatterSeries() const; QtCharts::QScatterSeries* scatterSeries() const;
QtCharts::QAreaSeries* areaSeries() const;
cvf::BoundingBox computeBoundingBox() const; cvf::BoundingBox computeBoundingBox() const;
private: private:
QtCharts::QLineSeries* m_lineSeries; QtCharts::QLineSeries* m_lineSeries;
QtCharts::QScatterSeries* m_scatterSeries; QtCharts::QScatterSeries* m_scatterSeries;
QtCharts::QAreaSeries* m_areaSeries;
std::shared_ptr<RiuPlotCurveSymbol> m_symbol; std::shared_ptr<RiuPlotCurveSymbol> m_symbol;
QPointer<RiuQtChartsPlotWidget> m_plotWidget; QPointer<RiuQtChartsPlotWidget> m_plotWidget;
RiuPlotAxis m_axisX; RiuPlotAxis m_axisX;
RiuPlotAxis m_axisY; RiuPlotAxis m_axisY;
bool m_isVisibleInLegend;
}; };

View File

@@ -828,6 +828,7 @@ QChart* RiuQtChartsPlotWidget::qtChart()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RiuQtChartsPlotWidget::attach( RiuPlotCurve* plotCurve, void RiuQtChartsPlotWidget::attach( RiuPlotCurve* plotCurve,
QAbstractSeries* lineSeries, QAbstractSeries* lineSeries,
QAbstractSeries* areaSeries,
QAbstractSeries* scatterSeries, QAbstractSeries* scatterSeries,
RiuPlotAxis xAxis, RiuPlotAxis xAxis,
RiuPlotAxis yAxis ) RiuPlotAxis yAxis )
@@ -849,6 +850,7 @@ void RiuQtChartsPlotWidget::attach( RiuPlotCurve* plotCurve,
auto qtChartsPlotCurve = dynamic_cast<RiuQtChartsPlotCurve*>( plotCurve ); auto qtChartsPlotCurve = dynamic_cast<RiuQtChartsPlotCurve*>( plotCurve );
addToChart( m_lineSeriesMap, plotCurve, lineSeries, xAxis, yAxis, qtChartsPlotCurve ); addToChart( m_lineSeriesMap, plotCurve, lineSeries, xAxis, yAxis, qtChartsPlotCurve );
addToChart( m_areaSeriesMap, plotCurve, areaSeries, xAxis, yAxis, qtChartsPlotCurve );
addToChart( m_scatterSeriesMap, plotCurve, scatterSeries, xAxis, yAxis, qtChartsPlotCurve ); addToChart( m_scatterSeriesMap, plotCurve, scatterSeries, xAxis, yAxis, qtChartsPlotCurve );
} }
@@ -858,6 +860,7 @@ void RiuQtChartsPlotWidget::attach( RiuPlotCurve* plotCurve,
void RiuQtChartsPlotWidget::detach( RiuPlotCurve* plotCurve ) void RiuQtChartsPlotWidget::detach( RiuPlotCurve* plotCurve )
{ {
m_lineSeriesMap.erase( plotCurve ); m_lineSeriesMap.erase( plotCurve );
m_areaSeriesMap.erase( plotCurve );
m_scatterSeriesMap.erase( plotCurve ); m_scatterSeriesMap.erase( plotCurve );
} }
@@ -873,6 +876,18 @@ QAbstractSeries* RiuQtChartsPlotWidget::getLineSeries( const RiuPlotCurve* plotC
return nullptr; return nullptr;
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QAbstractSeries* RiuQtChartsPlotWidget::getAreaSeries( const RiuPlotCurve* plotCurve ) const
{
auto series = m_areaSeriesMap.find( const_cast<RiuPlotCurve*>( plotCurve ) );
if ( series != m_areaSeriesMap.end() )
return series->second;
else
return nullptr;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -895,6 +910,7 @@ void RiuQtChartsPlotWidget::detachItems( RiuPlotWidget::PlotItemType plotItemTyp
if ( plotItemType == RiuPlotWidget::PlotItemType::CURVE ) if ( plotItemType == RiuPlotWidget::PlotItemType::CURVE )
{ {
m_lineSeriesMap.clear(); m_lineSeriesMap.clear();
m_areaSeriesMap.clear();
m_scatterSeriesMap.clear(); m_scatterSeriesMap.clear();
qtChart()->removeAllSeries(); qtChart()->removeAllSeries();
} }

View File

@@ -161,13 +161,15 @@ public:
QtCharts::QChart* qtChart(); QtCharts::QChart* qtChart();
void attach( RiuPlotCurve* plotCurve, void attach( RiuPlotCurve* plotCurve,
QtCharts::QAbstractSeries* lineseries, QtCharts::QAbstractSeries* lineSeries,
QtCharts::QAbstractSeries* areaSeries,
QtCharts::QAbstractSeries* scatterSeries, QtCharts::QAbstractSeries* scatterSeries,
RiuPlotAxis xAxis, RiuPlotAxis xAxis,
RiuPlotAxis yAxis ); RiuPlotAxis yAxis );
void detach( RiuPlotCurve* plotCurve ); void detach( RiuPlotCurve* plotCurve );
QtCharts::QAbstractSeries* getLineSeries( const RiuPlotCurve* plotCurve ) const; QtCharts::QAbstractSeries* getLineSeries( const RiuPlotCurve* plotCurve ) const;
QtCharts::QAbstractSeries* getAreaSeries( const RiuPlotCurve* plotCurve ) const;
QtCharts::QAbstractSeries* getScatterSeries( const RiuPlotCurve* plotCurve ) const; QtCharts::QAbstractSeries* getScatterSeries( const RiuPlotCurve* plotCurve ) const;
void setXAxis( RiuPlotAxis axis, QtCharts::QAbstractSeries* series, RiuQtChartsPlotCurve* plotCurve ); void setXAxis( RiuPlotAxis axis, QtCharts::QAbstractSeries* series, RiuQtChartsPlotCurve* plotCurve );
@@ -235,6 +237,7 @@ private:
std::map<RiuPlotAxis, bool> m_axesAutoScale; std::map<RiuPlotAxis, bool> m_axesAutoScale;
std::map<RiuPlotCurve*, QtCharts::QAbstractSeries*> m_lineSeriesMap; std::map<RiuPlotCurve*, QtCharts::QAbstractSeries*> m_lineSeriesMap;
std::map<RiuPlotCurve*, QtCharts::QAbstractSeries*> m_areaSeriesMap;
std::map<RiuPlotCurve*, QtCharts::QAbstractSeries*> m_scatterSeriesMap; std::map<RiuPlotCurve*, QtCharts::QAbstractSeries*> m_scatterSeriesMap;
RiuQwtDateScaleWrapper* m_dateScaleWrapper; RiuQwtDateScaleWrapper* m_dateScaleWrapper;