From 067e75c383cac25d884473f29b94b4ab07793bc8 Mon Sep 17 00:00:00 2001 From: Sami Varanka Date: Thu, 28 Mar 2024 09:52:03 +0200 Subject: Fix crashing surface and scatter removeseries MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add check for nullptr before calling deleteLater for the presenting 3D model. Fixes: QTBUG-123418 Change-Id: I85963b97079d4f99fdc1ef4c7a84e88392d92acb Reviewed-by: Tomi Korpipää --- src/graphs3d/qml/qquickgraphsscatter.cpp | 12 +++++++----- src/graphs3d/qml/qquickgraphssurface.cpp | 18 +++++++++++++----- src/graphs3d/qml/qquickgraphssurface_p.h | 1 + tests/auto/cpptest/qginput/tst_input.cpp | 2 +- 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/graphs3d/qml/qquickgraphsscatter.cpp b/src/graphs3d/qml/qquickgraphsscatter.cpp index 813ab4c..8130fd0 100644 --- a/src/graphs3d/qml/qquickgraphsscatter.cpp +++ b/src/graphs3d/qml/qquickgraphsscatter.cpp @@ -665,12 +665,14 @@ QString QQuickGraphsScatter::getMeshFileName(QAbstract3DSeries *series) void QQuickGraphsScatter::deleteDataItem(QQuick3DModel *item) { QQmlListReference materialsRef(item, "materials"); - if (materialsRef.size()) { - QObject *material = materialsRef.at(0); - delete material; + if (item) { + if (materialsRef.size()) { + QObject *material = materialsRef.at(0); + delete material; + } + item->deleteLater(); + item = nullptr; } - item->deleteLater(); - item = nullptr; } void QQuickGraphsScatter::handleSeriesChanged(QList changedSeries) diff --git a/src/graphs3d/qml/qquickgraphssurface.cpp b/src/graphs3d/qml/qquickgraphssurface.cpp index e4a7a89..fc4b835 100644 --- a/src/graphs3d/qml/qquickgraphssurface.cpp +++ b/src/graphs3d/qml/qquickgraphssurface.cpp @@ -660,12 +660,12 @@ void QQuickGraphsSurface::removeSeries(QSurface3DSeries *series) series->setParent(this); // Reparent as removing will leave series parentless for (int i = 0; i < m_model.size();) { if (m_model[i]->series == series) { - m_model[i]->model->deleteLater(); - m_model[i]->gridModel->deleteLater(); - m_model[i]->proxyModel->deleteLater(); + delete3DModel(m_model[i]->model); + delete3DModel(m_model[i]->gridModel); + delete3DModel(m_model[i]->proxyModel); if (sliceView()) { - m_model[i]->sliceModel->deleteLater(); - m_model[i]->sliceGridModel->deleteLater(); + delete3DModel(m_model[i]->sliceModel); + delete3DModel(m_model[i]->sliceGridModel); } m_model.removeAt(i); } else { @@ -2151,6 +2151,14 @@ void QQuickGraphsSurface::addSliceModel(SurfaceModel *model) model->sliceGridModel = gridModel; } +void QQuickGraphsSurface::delete3DModel(QQuick3DModel *model) +{ + if (model) { + model->deleteLater(); + model = nullptr; + } +} + void QQuickGraphsSurface::updateSingleHighlightColor() { m_instancing->setColor(theme()->singleHighlightColor()); diff --git a/src/graphs3d/qml/qquickgraphssurface_p.h b/src/graphs3d/qml/qquickgraphssurface_p.h index 3005da3..3c170b4 100644 --- a/src/graphs3d/qml/qquickgraphssurface_p.h +++ b/src/graphs3d/qml/qquickgraphssurface_p.h @@ -234,6 +234,7 @@ private: void updateSelectedPoint(); void addModel(QSurface3DSeries *series); void addSliceModel(SurfaceModel *model); + void delete3DModel(QQuick3DModel *model); QVector m_model; QQuick3DModel *m_selectionPointer = nullptr; diff --git a/tests/auto/cpptest/qginput/tst_input.cpp b/tests/auto/cpptest/qginput/tst_input.cpp index 8e29002..497f2e2 100644 --- a/tests/auto/cpptest/qginput/tst_input.cpp +++ b/tests/auto/cpptest/qginput/tst_input.cpp @@ -3,7 +3,7 @@ #include -#include > +#include #include class tst_input: public QObject -- cgit v1.2.3