diff options
author | Kirill Burtsev <kirill.burtsev@qt.io> | 2019-05-21 15:50:37 +0200 |
---|---|---|
committer | Kirill Burtsev <kirill.burtsev@qt.io> | 2019-05-22 13:59:46 +0000 |
commit | 93258593a47eb53502e7ceb38fc6fc4f05021389 (patch) | |
tree | 7f6ce67c6c6818fd59145ebf171b9ae89fff3260 | |
parent | b8d85346e877c24324cf6c658a55ea12869fcdf0 (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.cpp | 4 | ||||
-rw-r--r-- | src/charts/chartdataset.cpp | 4 | ||||
-rw-r--r-- | tests/auto/qcandlestickseries/tst_qcandlestickseries.cpp | 28 |
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); } |