summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKirill Burtsev <kirill.burtsev@qt.io>2019-05-21 15:50:37 +0200
committerKirill Burtsev <kirill.burtsev@qt.io>2019-05-22 13:59:46 +0000
commit93258593a47eb53502e7ceb38fc6fc4f05021389 (patch)
tree7f6ce67c6c6818fd59145ebf171b9ae89fff3260
parentb8d85346e877c24324cf6c658a55ea12869fcdf0 (diff)
Fix crash on ChartView component destroy
QML engine expects that children of QML element are deleted through parent/child relationship, but deferring breaks this assumption and leads to crash later in destruction process. Fixes: QTBUG-70987 Change-Id: I9ae3cefc6ee158582d17709272d7d33f45c57cdf Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io> Reviewed-by: Michal Klocek <michal.klocek@qt.io>
-rw-r--r--src/charts/candlestickchart/qcandlestickseries.cpp4
-rw-r--r--src/charts/chartdataset.cpp4
-rw-r--r--tests/auto/qcandlestickseries/tst_qcandlestickseries.cpp28
3 files changed, 21 insertions, 15 deletions
diff --git a/src/charts/candlestickchart/qcandlestickseries.cpp b/src/charts/candlestickchart/qcandlestickseries.cpp
index 89ee9170..8aefca54 100644
--- a/src/charts/candlestickchart/qcandlestickseries.cpp
+++ b/src/charts/candlestickchart/qcandlestickseries.cpp
@@ -553,7 +553,7 @@ bool QCandlestickSeries::remove(const QList<QCandlestickSet *> &sets)
emit candlestickSetsRemoved(sets);
emit countChanged();
foreach (QCandlestickSet *set, sets)
- set->deleteLater();
+ delete set;
}
return success;
@@ -630,7 +630,7 @@ void QCandlestickSeries::clear()
emit candlestickSetsRemoved(sets);
emit countChanged();
foreach (QCandlestickSet *set, sets)
- set->deleteLater();
+ delete set;
}
}
diff --git a/src/charts/chartdataset.cpp b/src/charts/chartdataset.cpp
index 3fe0f2eb..4fec0ae1 100644
--- a/src/charts/chartdataset.cpp
+++ b/src/charts/chartdataset.cpp
@@ -421,7 +421,7 @@ void ChartDataSet::deleteAllSeries()
{
foreach (QAbstractSeries *s , m_seriesList){
removeSeries(s);
- s->deleteLater();
+ delete s;
}
Q_ASSERT(m_seriesList.count() == 0);
}
@@ -430,7 +430,7 @@ void ChartDataSet::deleteAllAxes()
{
foreach (QAbstractAxis *a , m_axisList){
removeAxis(a);
- a->deleteLater();
+ delete a;
}
Q_ASSERT(m_axisList.count() == 0);
}
diff --git a/tests/auto/qcandlestickseries/tst_qcandlestickseries.cpp b/tests/auto/qcandlestickseries/tst_qcandlestickseries.cpp
index d65a5a34..a7b00836 100644
--- a/tests/auto/qcandlestickseries/tst_qcandlestickseries.cpp
+++ b/tests/auto/qcandlestickseries/tst_qcandlestickseries.cpp
@@ -81,8 +81,15 @@ private Q_SLOTS:
void mouseDoubleClicked();
private:
- QCandlestickSeries *m_series;
- QList<QCandlestickSet *> m_sets;
+ QPointer<QCandlestickSeries> m_series;
+ struct SetList : QList<QPointer<QCandlestickSet>> {
+ operator QList<QCandlestickSet *> () const {
+ QList<QCandlestickSet *> list;
+ for (int i = 0; i < count(); ++i)
+ list.append(at(i));
+ return list;
+ }
+ }; SetList m_sets;
};
void tst_QCandlestickSeries::initTestCase()
@@ -119,14 +126,9 @@ void tst_QCandlestickSeries::init()
void tst_QCandlestickSeries::cleanup()
{
- foreach (QCandlestickSet *set, m_sets) {
- m_series->remove(set);
- m_sets.removeAll(set);
- delete set;
- }
-
delete m_series;
- m_series = nullptr;
+ qDeleteAll(m_sets);
+ m_sets.clear();
}
void tst_QCandlestickSeries::qCandlestickSeries()
@@ -177,16 +179,20 @@ void tst_QCandlestickSeries::remove()
// Remove some sets
const int removeCount = 3;
- for (int i = 0; i < removeCount; ++i)
+ for (int i = 0; i < removeCount; ++i) {
QVERIFY(m_series->remove(m_sets.at(i)));
+ QVERIFY(!m_sets.at(i));
+ }
QCOMPARE(m_series->count(), m_sets.count() - removeCount);
for (int i = removeCount; i < m_sets.count(); ++i)
QCOMPARE(m_series->sets().at(i - removeCount), m_sets.at(i));
// Try removing all sets again (should be ok, even if some sets have already been removed)
- for (int i = 0; i < m_sets.count(); ++i)
+ for (int i = 0; i < m_sets.count(); ++i) {
m_series->remove(m_sets.at(i));
+ QVERIFY(!m_sets.at(i));
+ }
QCOMPARE(m_series->count(), 0);
}