From 3baa96f6b10fe412a4394b6a6e7c1c049b538756 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 30 Sep 2016 16:28:07 +0300 Subject: Fix crash on PieChartItem deletion MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The PieChartItem wasn't properly disconnected at the time it was removed from the chart and scheduled for deletion with deleteLater. Change-Id: Idf6bcabaef2961b1d7ff658a3e5bcf91fe928873 Reviewed-by: Tomi Korpipää Reviewed-by: Mika Salmela Reviewed-by: Miikka Heikkinen --- src/charts/chartitem.cpp | 5 +++++ src/charts/chartitem_p.h | 2 ++ src/charts/chartpresenter.cpp | 2 +- src/charts/piechart/piechartitem.cpp | 27 ++++++++++++++++++--------- src/charts/piechart/piechartitem_p.h | 2 ++ 5 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/charts/chartitem.cpp b/src/charts/chartitem.cpp index 8bdf68a3..1b745559 100644 --- a/src/charts/chartitem.cpp +++ b/src/charts/chartitem.cpp @@ -39,6 +39,11 @@ AbstractDomain* ChartItem::domain() const return m_series->domain(); } +void ChartItem::cleanup() +{ + disconnect(); +} + void ChartItem::handleDomainUpdated() { qWarning() << __FUNCTION__<< "Slot not implemented"; diff --git a/src/charts/chartitem_p.h b/src/charts/chartitem_p.h index b64a8ce6..833fc60f 100644 --- a/src/charts/chartitem_p.h +++ b/src/charts/chartitem_p.h @@ -44,6 +44,8 @@ class ChartItem : public ChartElement public: ChartItem(QAbstractSeriesPrivate *series,QGraphicsItem* item); AbstractDomain* domain() const; + virtual void cleanup(); + public Q_SLOTS: virtual void handleDomainUpdated(); diff --git a/src/charts/chartpresenter.cpp b/src/charts/chartpresenter.cpp index 96fcefee..b95a1268 100644 --- a/src/charts/chartpresenter.cpp +++ b/src/charts/chartpresenter.cpp @@ -138,7 +138,7 @@ void ChartPresenter::handleSeriesRemoved(QAbstractSeries *series) { ChartItem *chart = series->d_ptr->m_item.take(); chart->hide(); - chart->disconnect(); + chart->cleanup(); series->disconnect(chart); chart->deleteLater(); if (chart->animation()) diff --git a/src/charts/piechart/piechartitem.cpp b/src/charts/piechart/piechartitem.cpp index 273125de..a2ce330f 100644 --- a/src/charts/piechart/piechartitem.cpp +++ b/src/charts/piechart/piechartitem.cpp @@ -60,15 +60,7 @@ PieChartItem::PieChartItem(QPieSeries *series, QGraphicsItem* item) PieChartItem::~PieChartItem() { - // slices deleted automatically through QGraphicsItem - if (m_series) { - m_series->disconnect(this); - QPieSeriesPrivate::fromSeries(m_series)->disconnect(this); - } - foreach (QPieSlice *slice, m_sliceItems.keys()) { - slice->disconnect(this); - QPieSlicePrivate::fromSlice(slice)->disconnect(this); - } + cleanup(); } void PieChartItem::setAnimation(PieAnimation *animation) @@ -81,6 +73,23 @@ ChartAnimation *PieChartItem::animation() const return m_animation; } +void PieChartItem::cleanup() +{ + ChartItem::cleanup(); + + // slice items deleted automatically through QGraphicsItem + if (m_series) { + m_series->disconnect(this); + QPieSeriesPrivate::fromSeries(m_series)->disconnect(this); + m_series = 0; + } + foreach (QPieSlice *slice, m_sliceItems.keys()) { + slice->disconnect(this); + QPieSlicePrivate::fromSlice(slice)->disconnect(this); + } + m_sliceItems.clear(); +} + void PieChartItem::handleDomainUpdated() { QRectF rect(QPointF(0,0),domain()->size()); diff --git a/src/charts/piechart/piechartitem_p.h b/src/charts/piechart/piechartitem_p.h index 98593ba1..dc115e64 100644 --- a/src/charts/piechart/piechartitem_p.h +++ b/src/charts/piechart/piechartitem_p.h @@ -71,6 +71,8 @@ public Q_SLOTS: void setAnimation(PieAnimation *animation); ChartAnimation *animation() const; + // From ChartItem + void cleanup(); private: PieSliceData updateSliceGeometry(QPieSlice *slice); -- cgit v1.2.3