fix: fix delete measure crash bug

This commit is contained in:
kradchen
2025-07-07 10:18:21 +08:00
parent fffa3de358
commit 0b095927ff
4 changed files with 28 additions and 21 deletions

View File

@@ -9,22 +9,23 @@ MeasureStore *MeasureStore::instance = nullptr;
void MeasureStore::Store(QString SeriesUid, int plane, int slice, Measure *measure) { void MeasureStore::Store(QString SeriesUid, int plane, int slice, Measure *measure) {
if (!store.contains(SeriesUid)) { if (!store.contains(SeriesUid)) {
store[SeriesUid] = QMap<int, QMap<int, QList<Measure *>>>(); store[SeriesUid] = QMap<int, QMap<int, std::shared_ptr<QList<Measure *>>>>();
} }
if (!store[SeriesUid].contains(plane)) { if (!store[SeriesUid].contains(plane)) {
store[SeriesUid][plane] = QMap<int, QList<Measure *>>(); store[SeriesUid][plane] = QMap<int, std::shared_ptr<QList<Measure *>>>();
} }
if (!store[SeriesUid][plane].contains(slice)) { if (!store[SeriesUid][plane].contains(slice)) {
store[SeriesUid][plane][slice] = QList<Measure *>(); std::shared_ptr< QList<Measure *>> p(new QList<Measure *>());
store[SeriesUid][plane][slice] = p;
} }
measure->SetMeasureID( 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(); qDebug() << "store MeasureID:" << measure->GetMeasureID();
store[SeriesUid][plane][slice].push_back(measure); store[SeriesUid][plane][slice]->push_back(measure);
qDebug() << "measure count:" << store[SeriesUid][plane][slice].size(); // qDebug() << "measure count:" << store[SeriesUid][plane][slice].size();
} }
QList<Measure *> *MeasureStore::GetMeasures(QString SeriesUid, int plane, int slice) { std::shared_ptr<QList<Measure *>> MeasureStore::GetMeasures(QString SeriesUid, int plane, int slice) {
// qDebug() << "measure SeriesUid:" << SeriesUid << ", plane:" << plane << ", slice:" << slice; // qDebug() << "measure SeriesUid:" << SeriesUid << ", plane:" << plane << ", slice:" << slice;
if (!store.contains(SeriesUid)) if (!store.contains(SeriesUid))
@@ -33,32 +34,33 @@ QList<Measure *> *MeasureStore::GetMeasures(QString SeriesUid, int plane, int sl
return nullptr; return nullptr;
if (!store[SeriesUid][plane].contains(slice)) if (!store[SeriesUid][plane].contains(slice))
return nullptr; return nullptr;
qDebug() << "measure count:" << store[SeriesUid][plane][slice].size(); qDebug() << "measure count:" << store[SeriesUid][plane][slice]->size();
return &store[SeriesUid][plane][slice]; return store[SeriesUid][plane][slice];
} }
void MeasureStore::Remove(Measure *measure) { void MeasureStore::Remove(Measure *measure) {
QString id = measure->GetMeasureID(); QString id = measure->GetMeasureID();
QStringList list = id.split("-"); QStringList list = id.split("-");
measure->ForceDelete(); 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) { 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(); item->ForceDelete();
} }
store[SeriesUid][plane][slice].clear(); store[SeriesUid][plane][slice]->clear();
store[SeriesUid][plane].remove(slice);
} }
void MeasureStore::RemoveAllInSeries(QString SeriesUid) { void MeasureStore::RemoveAllInSeries(QString SeriesUid) {
for (auto series:store[SeriesUid]) { for (auto series:store[SeriesUid]) {
for (auto plane :series) { for (auto plane :series) {
for (auto item: plane) { for (auto item: *plane) {
item->ForceDelete(); item->ForceDelete();
} }
plane.clear(); plane->clear();
} }
series.clear(); series.clear();
} }
@@ -69,13 +71,13 @@ void MeasureStore::Clear() {
for (auto item: store) { for (auto item: store) {
for (auto plane :item) { for (auto plane :item) {
for (auto list :plane) { for (auto list :plane) {
for (auto m : list) { for (auto m : *list) {
if (m) { if (m) {
m->ForceDelete(); m->ForceDelete();
m = nullptr; m = nullptr;
} }
} }
list.clear(); list->clear();
} }
} }
} }

View File

@@ -9,6 +9,7 @@ class Measure;
#include <unordered_map> #include <unordered_map>
#include <QMap> #include <QMap>
#include <QList> #include <QList>
#include <memory>
class MeasureStore { class MeasureStore {
public: public:
@@ -29,10 +30,10 @@ public:
void Clear(); void Clear();
QList<Measure *> *GetMeasures(QString SeriesUid, int plane, int slice); std::shared_ptr<QList<Measure *>> GetMeasures(QString SeriesUid, int plane, int slice);
private: private:
QMap<QString, QMap<int, QMap<int, QList<Measure *>>>> store; QMap<QString, QMap<int, QMap<int, std::shared_ptr<QList<Measure *>>>>> store;
static MeasureStore *instance; static MeasureStore *instance;
}; };

View File

@@ -1133,17 +1133,20 @@ void DICOMImageViewer::LoadMeasures(bool forceReload) {
void DICOMImageViewer::ReloadCurrentSliceMeasure() { void DICOMImageViewer::ReloadCurrentSliceMeasure() {
list = measureStore->GetMeasures(SERIES_UID, this->SliceIJK, ImageMapper->GetSliceNumber()); list = measureStore->GetMeasures(SERIES_UID, this->SliceIJK, ImageMapper->GetSliceNumber());
if (list) { if (list.use_count()>1) {
for (int i = 0; i < list->length(); i++) { for (int i = 0; i < list->length(); i++) {
auto item = list->value(i); auto item = list->value(i);
auto d = dynamic_cast<DraggableActor *>(item); auto d = dynamic_cast<DraggableActor *>(item);
if (d) d->SetRenderer(GetRenderer()); if (d) d->SetRenderer(GetRenderer());
} }
} }
else{
list.reset();
}
} }
void DICOMImageViewer::ClearCurrentSliceMeasure() const { void DICOMImageViewer::ClearCurrentSliceMeasure() const {
if (list) { if (list.use_count()>1) {
for (int i = 0; i < list->length(); i++) { for (int i = 0; i < list->length(); i++) {
auto item = list->value(i); auto item = list->value(i);
auto d = dynamic_cast<DraggableActor *>(item); auto d = dynamic_cast<DraggableActor *>(item);

View File

@@ -1,6 +1,7 @@
#ifndef infinitiViewer_h #ifndef infinitiViewer_h
#define infinitiViewer_h #define infinitiViewer_h
#include <memory>
#include "vtkInteractionImageModule.h" // For export macro #include "vtkInteractionImageModule.h" // For export macro
#include "vtkObject.h" #include "vtkObject.h"
#include "vector" #include "vector"
@@ -423,7 +424,7 @@ private:
//for convert vtkEvent to Qt signal //for convert vtkEvent to Qt signal
vtkSignalRaiser raiser; vtkSignalRaiser raiser;
QList<Measure *> *list = nullptr; std::shared_ptr<QList<Measure *>> list;
MeasureStore *measureStore; MeasureStore *measureStore;