diff options
author | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2016-09-30 16:28:07 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2016-10-06 13:21:24 +0000 |
commit | 3baa96f6b10fe412a4394b6a6e7c1c049b538756 (patch) | |
tree | 0e4e1a24112f902a9d75faaf0702fb24c07cce0a | |
parent | 1474e311738e2676b65c4c40dc7ff0dbf4d6a5bd (diff) |
Fix crash on PieChartItem deletion
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ää <tomi.korpipaa@qt.io>
Reviewed-by: Mika Salmela <mika.salmela@qt.io>
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
-rw-r--r-- | src/charts/chartitem.cpp | 5 | ||||
-rw-r--r-- | src/charts/chartitem_p.h | 2 | ||||
-rw-r--r-- | src/charts/chartpresenter.cpp | 2 | ||||
-rw-r--r-- | src/charts/piechart/piechartitem.cpp | 27 | ||||
-rw-r--r-- | 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); |