summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2016-09-30 16:28:07 +0300
committerMiikka Heikkinen <miikka.heikkinen@qt.io>2016-10-06 13:21:24 +0000
commit3baa96f6b10fe412a4394b6a6e7c1c049b538756 (patch)
tree0e4e1a24112f902a9d75faaf0702fb24c07cce0a
parent1474e311738e2676b65c4c40dc7ff0dbf4d6a5bd (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.cpp5
-rw-r--r--src/charts/chartitem_p.h2
-rw-r--r--src/charts/chartpresenter.cpp2
-rw-r--r--src/charts/piechart/piechartitem.cpp27
-rw-r--r--src/charts/piechart/piechartitem_p.h2
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);