]> Creatis software - clitk.git/commitdiff
Romulo
authordsarrut <dsarrut>
Thu, 7 Apr 2011 08:51:20 +0000 (08:51 +0000)
committerdsarrut <dsarrut>
Thu, 7 Apr 2011 08:51:20 +0000 (08:51 +0000)
- Solved bug 295
  + Removed the "destroyed" flag
  + List/Tree widget is now cleared in the destructor
  + Destruction order was the cause for the crash
- Made destructors virtual in the base classes
  + It could contribute to memory leaks
  + Other class hierarchies should be checked as well

vv/vvToolBase.h
vv/vvToolBaseBase.h
vv/vvToolStructureSetManager.cxx
vv/vvToolStructureSetManager.h
vv/vvToolWidgetBase.h

index 2abd2a652d699d61adf0593f0d10e493db1d11dd..b4a6cd8f9142332a082a4358b2f50d621b67b73b 100644 (file)
@@ -27,6 +27,8 @@ template<class ToolType>
 class vvToolBase : public vvToolBaseBase {
 public:
   vvToolBase(vvMainWindowBase * m);
+  virtual ~vvToolBase() {};
+  
   static void Initialize();  // can't be virtual, must be overwritten
 
   static void SetToolName(QString n) { vvToolCreator<ToolType>::GetInstance()->mToolName = n; }
index 74cd25b6cb7e14dd0153eddf30bd1dcd5af3e1af..ffd169be217d5d40fcca7ad3382de5b03d511139 100644 (file)
@@ -23,6 +23,9 @@
 
 //------------------------------------------------------------------------------
 class vvToolBaseBase {
+public:
+  virtual ~vvToolBaseBase() {};
+  
 protected:
   vvMainWindowBase * mMainWindowBase;
 };
index c9e336884b65bb746c5808f3723ae05ba4c49368..fd09b11f2fc9c74b97af0167da47bd379acd5fa7 100644 (file)
@@ -27,7 +27,8 @@
 #include <QFileDialog>
 #include <QMessageBox>
 #include <QColorDialog>
-
+#include <QAbstractEventDispatcher>
 // vtk
 #include <vtkLookupTable.h>
 #include <vtkRenderWindow.h>
@@ -41,7 +42,6 @@ ADD_TOOL(vvToolStructureSetManager);
 int vvToolStructureSetManager::m_NumberOfTool = 0;
 std::vector<vvSlicerManager*> vvToolStructureSetManager::mListOfInputs;
 std::map<vvSlicerManager*, vvToolStructureSetManager*> vvToolStructureSetManager::mListOfOpenTool;
-bool vvToolStructureSetManager::mDestroyed = false;
 
 //------------------------------------------------------------------------------
 vvToolStructureSetManager::vvToolStructureSetManager(vvMainWindowBase * parent, 
@@ -100,9 +100,15 @@ vvToolStructureSetManager::vvToolStructureSetManager(vvMainWindowBase * parent,
 //------------------------------------------------------------------------------
 vvToolStructureSetManager::~vvToolStructureSetManager()
 {
-  //std::cout << "vvToolStructureSetManager::~vvToolStructureSetManager()" << std::endl;
   m_NumberOfTool--;
-  mDestroyed=true;
+  
+  // clearing the list at this point avoids
+  // segfaulting due to events being dispatched
+  // after object destruction
+  mTreeWidgetList.clear();
+  mTree->clearSelection();
+
+  //std::cout << "vvToolStructureSetManager::~vvToolStructureSetManager()" << std::endl;
 }
 //------------------------------------------------------------------------------
 
@@ -362,6 +368,7 @@ void vvToolStructureSetManager::apply()
 bool vvToolStructureSetManager::close()
 {
   //std::cout << "vvToolStructureSetManager::close()" << std::endl;
+
   return vvToolWidgetBase::close();
 }
 //------------------------------------------------------------------------------
@@ -371,7 +378,6 @@ bool vvToolStructureSetManager::close()
 void vvToolStructureSetManager::closeEvent(QCloseEvent *event) 
 {
   //std::cout << "vvToolStructureSetManager::closeEvent()" << std::endl;
-  disconnect(mTree, SIGNAL(itemSelectionChanged()));
 
   std::vector<vvSlicerManager*>::iterator iter = std::find(mListOfInputs.begin(), mListOfInputs.end(), mCurrentSlicerManager);
   if (iter != mListOfInputs.end()) mListOfInputs.erase(iter);
@@ -403,16 +409,6 @@ void vvToolStructureSetManager::closeEvent(QCloseEvent *event)
 //------------------------------------------------------------------------------
 void vvToolStructureSetManager::SelectedItemChangedInTree() {
   
-  // ATTENTION:
-  //  RP - 05/04/2011
-  //  Horrible solution for the problem of triggering this event
-  // after the window has been closed and the object instance 
-  // has been destroyed. I couldn't find the place where the
-  // window is destroyed, though.
-  //
-  if (mDestroyed)
-    return;
-  
   // Search which roi is selected
   QList<QTreeWidgetItem *> l = mTree->selectedItems();
   if (l.size() == 0) {
index 89af5abdda17d4ba9bd034b0c90ec4b225609977..5bbc7156da93917f01d1602bd79f1a8cadfd1fda 100644 (file)
@@ -39,7 +39,7 @@ class vvToolStructureSetManager:
   Q_OBJECT
   public:
   vvToolStructureSetManager(vvMainWindowBase* parent=0, Qt::WindowFlags f=0, vvSlicerManager * c = NULL);
-  ~vvToolStructureSetManager();
+  virtual ~vvToolStructureSetManager();
 
   static void Initialize();
   virtual void InputIsSelected(vvSlicerManager *m);
@@ -95,7 +95,6 @@ protected:
   virtual void CheckInputList(std::vector<vvSlicerManager*> & l, int & index);
   static std::vector<vvSlicerManager*> mListOfInputs;
   static std::map<vvSlicerManager*, vvToolStructureSetManager*> mListOfOpenTool;
-  static bool mDestroyed;
   static int m_NumberOfTool;
   bool MustOpenDialogWhenCreated;
  
index 0951fa1888b79fc7b6ac3a42b357a7e4cb5375fd..2c3ddd99a2fc54261b95a595a3c743f9807d9dd0 100644 (file)
@@ -37,7 +37,7 @@ class vvToolWidgetBase:
   public:
 
   vvToolWidgetBase(vvMainWindowBase * parent=0, Qt::WindowFlags f=Qt::Dialog, bool initialize=true); // default is a dialog
-  ~vvToolWidgetBase();
+  virtual ~vvToolWidgetBase();
 
   virtual void InputIsSelected(vvSlicerManager *m);
   virtual void InputIsSelected(std::vector<vvSlicerManager*> & l);