From 0b095927ff9e91a5401ea36ef726aa76f8f8a399 Mon Sep 17 00:00:00 2001 From: kradchen Date: Mon, 7 Jul 2025 10:18:21 +0800 Subject: [PATCH] fix: fix delete measure crash bug --- src/src/Rendering/Measure/MeasureStore.cpp | 34 ++++++++++--------- src/src/Rendering/Measure/MeasureStore.h | 5 +-- src/src/Rendering/Viewer/DICOMImageViewer.cxx | 7 ++-- src/src/Rendering/Viewer/DICOMImageViewer.h | 3 +- 4 files changed, 28 insertions(+), 21 deletions(-) diff --git a/src/src/Rendering/Measure/MeasureStore.cpp b/src/src/Rendering/Measure/MeasureStore.cpp index ed2858c..b001f97 100644 --- a/src/src/Rendering/Measure/MeasureStore.cpp +++ b/src/src/Rendering/Measure/MeasureStore.cpp @@ -9,22 +9,23 @@ MeasureStore *MeasureStore::instance = nullptr; void MeasureStore::Store(QString SeriesUid, int plane, int slice, Measure *measure) { if (!store.contains(SeriesUid)) { - store[SeriesUid] = QMap>>(); + store[SeriesUid] = QMap>>>(); } if (!store[SeriesUid].contains(plane)) { - store[SeriesUid][plane] = QMap>(); + store[SeriesUid][plane] = QMap>>(); } if (!store[SeriesUid][plane].contains(slice)) { - store[SeriesUid][plane][slice] = QList(); + std::shared_ptr< QList> p(new QList()); + store[SeriesUid][plane][slice] = p; } measure->SetMeasureID( - QString("%1-%2-%3-%4").arg(SeriesUid).arg(plane).arg(slice).arg(store[SeriesUid][plane][slice].size())); + QString("%1-%2-%3-%4").arg(SeriesUid).arg(plane).arg(slice).arg(store[SeriesUid][plane][slice]->size())); qDebug() << "store MeasureID:" << measure->GetMeasureID(); - store[SeriesUid][plane][slice].push_back(measure); - qDebug() << "measure count:" << store[SeriesUid][plane][slice].size(); + store[SeriesUid][plane][slice]->push_back(measure); + // qDebug() << "measure count:" << store[SeriesUid][plane][slice].size(); } -QList *MeasureStore::GetMeasures(QString SeriesUid, int plane, int slice) { +std::shared_ptr> MeasureStore::GetMeasures(QString SeriesUid, int plane, int slice) { // qDebug() << "measure SeriesUid:" << SeriesUid << ", plane:" << plane << ", slice:" << slice; if (!store.contains(SeriesUid)) @@ -33,32 +34,33 @@ QList *MeasureStore::GetMeasures(QString SeriesUid, int plane, int sl return nullptr; if (!store[SeriesUid][plane].contains(slice)) return nullptr; - qDebug() << "measure count:" << store[SeriesUid][plane][slice].size(); - return &store[SeriesUid][plane][slice]; + qDebug() << "measure count:" << store[SeriesUid][plane][slice]->size(); + return store[SeriesUid][plane][slice]; } void MeasureStore::Remove(Measure *measure) { QString id = measure->GetMeasureID(); QStringList list = id.split("-"); measure->ForceDelete(); - store[list[0]][list[1].toInt()][list[2].toInt()].removeOne(measure); + store[list[0]][list[1].toInt()][list[2].toInt()]->removeOne(measure); } void MeasureStore::RemoveAllInSlice(QString SeriesUid, int plane, int slice) { - for (auto item:store[SeriesUid][plane][slice]) { + for (auto item:(*store[SeriesUid][plane][slice])) { item->ForceDelete(); } - store[SeriesUid][plane][slice].clear(); + store[SeriesUid][plane][slice]->clear(); + store[SeriesUid][plane].remove(slice); } void MeasureStore::RemoveAllInSeries(QString SeriesUid) { for (auto series:store[SeriesUid]) { for (auto plane :series) { - for (auto item: plane) { + for (auto item: *plane) { item->ForceDelete(); } - plane.clear(); + plane->clear(); } series.clear(); } @@ -69,13 +71,13 @@ void MeasureStore::Clear() { for (auto item: store) { for (auto plane :item) { for (auto list :plane) { - for (auto m : list) { + for (auto m : *list) { if (m) { m->ForceDelete(); m = nullptr; } } - list.clear(); + list->clear(); } } } diff --git a/src/src/Rendering/Measure/MeasureStore.h b/src/src/Rendering/Measure/MeasureStore.h index 23ea857..eb6c9d6 100644 --- a/src/src/Rendering/Measure/MeasureStore.h +++ b/src/src/Rendering/Measure/MeasureStore.h @@ -9,6 +9,7 @@ class Measure; #include #include #include +#include class MeasureStore { public: @@ -29,10 +30,10 @@ public: void Clear(); - QList *GetMeasures(QString SeriesUid, int plane, int slice); + std::shared_ptr> GetMeasures(QString SeriesUid, int plane, int slice); private: - QMap>>> store; + QMap>>>> store; static MeasureStore *instance; }; diff --git a/src/src/Rendering/Viewer/DICOMImageViewer.cxx b/src/src/Rendering/Viewer/DICOMImageViewer.cxx index 74f16fc..70682ad 100644 --- a/src/src/Rendering/Viewer/DICOMImageViewer.cxx +++ b/src/src/Rendering/Viewer/DICOMImageViewer.cxx @@ -1133,17 +1133,20 @@ void DICOMImageViewer::LoadMeasures(bool forceReload) { void DICOMImageViewer::ReloadCurrentSliceMeasure() { list = measureStore->GetMeasures(SERIES_UID, this->SliceIJK, ImageMapper->GetSliceNumber()); - if (list) { + if (list.use_count()>1) { for (int i = 0; i < list->length(); i++) { auto item = list->value(i); auto d = dynamic_cast(item); if (d) d->SetRenderer(GetRenderer()); } } + else{ + list.reset(); + } } void DICOMImageViewer::ClearCurrentSliceMeasure() const { - if (list) { + if (list.use_count()>1) { for (int i = 0; i < list->length(); i++) { auto item = list->value(i); auto d = dynamic_cast(item); diff --git a/src/src/Rendering/Viewer/DICOMImageViewer.h b/src/src/Rendering/Viewer/DICOMImageViewer.h index c12e704..d871396 100644 --- a/src/src/Rendering/Viewer/DICOMImageViewer.h +++ b/src/src/Rendering/Viewer/DICOMImageViewer.h @@ -1,6 +1,7 @@ #ifndef infinitiViewer_h #define infinitiViewer_h +#include #include "vtkInteractionImageModule.h" // For export macro #include "vtkObject.h" #include "vector" @@ -423,7 +424,7 @@ private: //for convert vtkEvent to Qt signal vtkSignalRaiser raiser; - QList *list = nullptr; + std::shared_ptr> list; MeasureStore *measureStore;