Memory Management : Fixes related to plot objects and curves

This commit is contained in:
Magne Sjaastad
2022-02-25 14:47:15 +01:00
parent 47a44a79df
commit 4693dc44ef
14 changed files with 128 additions and 60 deletions

View File

@@ -54,7 +54,26 @@ RiuQtChartsPlotCurve::RiuQtChartsPlotCurve( RimPlotCurve* ownerRimCurve, const Q
//--------------------------------------------------------------------------------------------------
RiuQtChartsPlotCurve::~RiuQtChartsPlotCurve()
{
detach();
if ( m_plotWidget && m_plotWidget->qtChart() )
{
auto* line = lineSeries();
if ( line )
{
m_plotWidget->qtChart()->removeSeries( line );
// removeSeries() releases chart ownership of the data, delete data to avoid memory leak
delete line;
}
auto* scatter = scatterSeries();
if ( scatter )
{
m_plotWidget->qtChart()->removeSeries( scatter );
// removeSeries() releases chart ownership of the data, delete data to avoid memory leak
delete scatter;
}
}
// Delete if it is still owned by by plot curve
delete m_lineSeries;
@@ -164,8 +183,6 @@ void RiuQtChartsPlotCurve::detach()
}
if ( m_plotWidget ) setVisibleInLegend( false );
m_plotWidget = nullptr;
}
//--------------------------------------------------------------------------------------------------
@@ -188,13 +205,15 @@ void RiuQtChartsPlotCurve::setSamplesInPlot( const std::vector<double>& xValues,
QtCharts::QLineSeries* line = lineSeries();
QtCharts::QScatterSeries* scatter = scatterSeries();
line->clear();
scatter->clear();
QVector<QPointF> values( static_cast<int>( xValues.size() ) );
for ( int i = 0; i < static_cast<int>( xValues.size() ); i++ )
{
line->append( xValues[i], yValues[i] );
scatter->append( xValues[i], yValues[i] );
values[i] = QPointF( xValues[i], yValues[i] );
}
line->replace( values );
scatter->replace( values );
}
//--------------------------------------------------------------------------------------------------

View File

@@ -90,7 +90,7 @@ private:
QtCharts::QLineSeries* m_lineSeries;
QtCharts::QScatterSeries* m_scatterSeries;
std::shared_ptr<RiuPlotCurveSymbol> m_symbol;
RiuQtChartsPlotWidget* m_plotWidget;
QPointer<RiuQtChartsPlotWidget> m_plotWidget;
RiuPlotAxis m_axisX;
RiuPlotAxis m_axisY;
};

View File

@@ -717,8 +717,8 @@ RiuQtChartsPlotWidget::AxisScaleType RiuQtChartsPlotWidget::axisScaleType( RiuPl
//--------------------------------------------------------------------------------------------------
void RiuQtChartsPlotWidget::setAxisScaleType( RiuPlotAxis axis, RiuQtChartsPlotWidget::AxisScaleType axisScaleType )
{
QAbstractAxis* removeaxis = plotAxis( axis );
QAbstractAxis* insertaxis = nullptr;
QAbstractAxis* axisToBeDeleted = plotAxis( axis );
QAbstractAxis* insertaxis = nullptr;
if ( axisScaleType == AxisScaleType::LOGARITHMIC )
{
@@ -734,15 +734,19 @@ void RiuQtChartsPlotWidget::setAxisScaleType( RiuPlotAxis axis, RiuQtChartsPlotW
}
QChart* chart = qtChart();
if ( chart->axes().contains( removeaxis ) ) chart->removeAxis( removeaxis );
if ( chart->axes().contains( axisToBeDeleted ) ) chart->removeAxis( axisToBeDeleted );
chart->addAxis( insertaxis, mapPlotAxisToQtAlignment( axis.axis() ) );
m_axes[axis] = insertaxis;
for ( auto serie : chart->series() )
{
if ( serie->attachedAxes().contains( removeaxis ) ) serie->detachAxis( removeaxis );
if ( serie->attachedAxes().contains( axisToBeDeleted ) ) serie->detachAxis( axisToBeDeleted );
serie->attachAxis( insertaxis );
}
// We have the ownership of the axis object, delete to avoid memory leak
delete axisToBeDeleted;
axisToBeDeleted = nullptr;
}
//--------------------------------------------------------------------------------------------------
@@ -789,8 +793,6 @@ void RiuQtChartsPlotWidget::attach( RiuPlotCurve* plotCurve,
qtChart()->addSeries( series );
setXAxis( xAxis, series );
setXAxis( yAxis, series );
rescaleAxis( xAxis );
rescaleAxis( yAxis );
}
};

View File

@@ -63,12 +63,10 @@ RiuQwtPlotCurve::RiuQwtPlotCurve( RimPlotCurve* ownerRimCurve, const QString& ti
//--------------------------------------------------------------------------------------------------
RiuQwtPlotCurve::~RiuQwtPlotCurve()
{
if ( m_qwtCurveErrorBars )
{
m_qwtCurveErrorBars->detach();
delete m_qwtCurveErrorBars;
m_qwtCurveErrorBars = nullptr;
}
detach();
delete m_qwtCurveErrorBars;
m_qwtCurveErrorBars = nullptr;
}
//--------------------------------------------------------------------------------------------------

View File

@@ -37,8 +37,7 @@
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RiuSummaryPlot::RiuSummaryPlot( RimSummaryPlot* plot, QWidget* parent )
: QWidget( parent )
RiuSummaryPlot::RiuSummaryPlot( RimSummaryPlot* plot )
{
}
@@ -54,6 +53,8 @@ RiuSummaryPlot::~RiuSummaryPlot()
//--------------------------------------------------------------------------------------------------
void RiuSummaryPlot::showContextMenu( QPoint pos )
{
if ( !plotWidget() ) return;
QMenu menu;
caf::CmdFeatureMenuBuilder menuBuilder;
@@ -66,7 +67,7 @@ void RiuSummaryPlot::showContextMenu( QPoint pos )
if ( plotCurve && closestCurvePoint >= 0 )
{
RimSummaryCurve* summaryCurve = dynamic_cast<RimSummaryCurve*>( plotCurve->ownerRimCurve() );
auto* summaryCurve = dynamic_cast<RimSummaryCurve*>( plotCurve->ownerRimCurve() );
if ( summaryCurve && closestCurvePoint < (int)summaryCurve->timeStepsY().size() )
{
std::time_t timeStep = summaryCurve->timeStepsY()[closestCurvePoint];
@@ -105,7 +106,7 @@ void RiuSummaryPlot::showContextMenu( QPoint pos )
if ( !curveClicked )
{
RimSummaryPlot* summaryPlot = static_cast<RimSummaryPlot*>( plotWidget()->plotDefinition() );
auto* summaryPlot = static_cast<RimSummaryPlot*>( plotWidget()->plotDefinition() );
std::vector<RimEnsembleCurveSet*> allCurveSetsInPlot;
summaryPlot->descendantsOfType( allCurveSetsInPlot );
for ( auto curveSet : allCurveSetsInPlot )
@@ -185,9 +186,9 @@ void RiuSummaryPlot::showContextMenu( QPoint pos )
menuBuilder.appendToMenu( &menu );
if ( menu.actions().size() > 0 )
if ( !menu.actions().empty() )
{
menu.exec( mapToGlobal( pos ) );
menu.exec( plotWidget()->mapToGlobal( pos ) );
// Parts of progress dialog GUI can be present after menu has closed related to
// RicImportGridModelFromSummaryCurveFeature. Make sure the plot is updated, and call processEvents() to make

View File

@@ -19,9 +19,9 @@
#pragma once
#include "RiaQDateTimeTools.h"
#include "RiuInterfaceToViewWindow.h"
#include <QWidget>
#include <QObject>
#include <QPoint>
class RimSummaryPlot;
class RimPlotAxisPropertiesInterface;
@@ -32,12 +32,12 @@ class RiuPlotWidget;
//
//
//==================================================================================================
class RiuSummaryPlot : public QWidget
class RiuSummaryPlot : public QObject
{
Q_OBJECT
public:
RiuSummaryPlot( RimSummaryPlot* plot, QWidget* parent );
~RiuSummaryPlot() override;
RiuSummaryPlot( RimSummaryPlot* plot );
~RiuSummaryPlot();
virtual void useDateBasedTimeAxis(
const QString& dateFormat,

View File

@@ -29,8 +29,8 @@
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RiuSummaryQtChartsPlot::RiuSummaryQtChartsPlot( RimSummaryPlot* plot, QWidget* parent /*= nullptr*/ )
: RiuSummaryPlot( plot, parent )
RiuSummaryQtChartsPlot::RiuSummaryQtChartsPlot( RimSummaryPlot* plot )
: RiuSummaryPlot( plot )
{
m_plotWidget = new RiuQtChartsPlotWidget( plot );
m_plotWidget->setContextMenuPolicy( Qt::CustomContextMenu );
@@ -49,6 +49,8 @@ RiuSummaryQtChartsPlot::RiuSummaryQtChartsPlot( RimSummaryPlot* plot, QWidget* p
//--------------------------------------------------------------------------------------------------
RiuSummaryQtChartsPlot::~RiuSummaryQtChartsPlot()
{
delete m_plotWidget;
m_plotWidget = nullptr;
}
//--------------------------------------------------------------------------------------------------

View File

@@ -38,7 +38,7 @@ class RiuSummaryQtChartsPlot : public RiuSummaryPlot
Q_OBJECT;
public:
RiuSummaryQtChartsPlot( RimSummaryPlot* plot, QWidget* parent = nullptr );
RiuSummaryQtChartsPlot( RimSummaryPlot* plot );
~RiuSummaryQtChartsPlot() override;
void useDateBasedTimeAxis( const QString& dateFormat,

View File

@@ -94,7 +94,7 @@ static EnsembleCurveInfoTextProvider ensembleCurveInfoTextProvider;
///
//--------------------------------------------------------------------------------------------------
RiuSummaryQwtPlot::RiuSummaryQwtPlot( RimSummaryPlot* plot, QWidget* parent /*= nullptr*/ )
: RiuSummaryPlot( plot, parent )
: RiuSummaryPlot( plot )
{
m_plotWidget = new RiuQwtPlotWidget( plot, parent );
m_plotWidget->setContextMenuPolicy( Qt::CustomContextMenu );
@@ -138,6 +138,8 @@ RiuSummaryQwtPlot::RiuSummaryQwtPlot( RimSummaryPlot* plot, QWidget* parent /*=
//--------------------------------------------------------------------------------------------------
RiuSummaryQwtPlot::~RiuSummaryQwtPlot()
{
delete m_plotWidget;
m_plotWidget = nullptr;
}
//--------------------------------------------------------------------------------------------------

View File

@@ -45,7 +45,7 @@ class RiuSummaryQwtPlot : public RiuSummaryPlot
public:
RiuSummaryQwtPlot( RimSummaryPlot* plot, QWidget* parent = nullptr );
~RiuSummaryQwtPlot() override;
~RiuSummaryQwtPlot();
void useDateBasedTimeAxis( const QString& dateFormat,
const QString& timeFormat,