Bläddra i källkod

Prevent python finalization issue - Reference ctkWorkflow using weakpointer

Doing so ensure the pointer to ctkWorkflow won't be dangling.
Jean-Christophe Fillion-Robin 13 år sedan
förälder
incheckning
d629b1afb0
1 ändrade filer med 20 tillägg och 13 borttagningar
  1. 20 13
      Libs/Widgets/ctkWorkflowWidget.cpp

+ 20 - 13
Libs/Widgets/ctkWorkflowWidget.cpp

@@ -19,8 +19,9 @@
 =========================================================================*/
 
 // Qt includes
-#include <QWidget>
 #include <QDebug>
+#include <QWidget>
+#include <QWeakPointer>
 
 // CTK includes
 #include "ctkWorkflowWidget.h"
@@ -45,7 +46,7 @@ public:
   ctkWorkflowWidgetPrivate();
   ~ctkWorkflowWidgetPrivate();
 
-  ctkWorkflow* Workflow;
+  QWeakPointer<ctkWorkflow>   Workflow;
 
   ctkWorkflowGroupBox*        WorkflowGroupBox;
   ctkWorkflowButtonBoxWidget* ButtonBoxWidget;
@@ -59,8 +60,6 @@ public:
 //---------------------------------------------------------------------------
 ctkWorkflowWidgetPrivate::ctkWorkflowWidgetPrivate()
 {
-  this->Workflow = 0;
-
   this->WorkflowGroupBox = 0;
   this->ButtonBoxWidget = 0;
 
@@ -70,9 +69,9 @@ ctkWorkflowWidgetPrivate::ctkWorkflowWidgetPrivate()
 //---------------------------------------------------------------------------
 ctkWorkflowWidgetPrivate::~ctkWorkflowWidgetPrivate()
 {
-  if (this->Workflow)
+  if (!this->Workflow.isNull())
     {
-    foreach(ctkWorkflowStep* step, this->Workflow->steps())
+    foreach(ctkWorkflowStep* step, this->Workflow.data()->steps())
       {
       ctkWorkflowWidgetStep * widgetStep = dynamic_cast<ctkWorkflowWidgetStep*>(step);
       if (widgetStep)
@@ -102,7 +101,13 @@ ctkWorkflowWidget::~ctkWorkflowWidget()
 }
 
 // --------------------------------------------------------------------------
-CTK_GET_CPP(ctkWorkflowWidget, ctkWorkflow*, workflow, Workflow);
+ctkWorkflow* ctkWorkflowWidget::workflow()const
+{
+  Q_D(const ctkWorkflowWidget);
+  return d->Workflow.data();
+}
+
+// --------------------------------------------------------------------------
 CTK_GET_CPP(ctkWorkflowWidget, ctkWorkflowGroupBox*, workflowGroupBox, WorkflowGroupBox);
 CTK_GET_CPP(ctkWorkflowWidget, bool, showButtonBoxWidget, ShowButtonBoxWidget);
 CTK_SET_CPP(ctkWorkflowWidget, bool, setShowButtonBoxWidget, ShowButtonBoxWidget);
@@ -119,17 +124,19 @@ void ctkWorkflowWidget::setWorkflow(ctkWorkflow* newWorkflow)
     return;
     }
 
-  if (d->Workflow)
+  if (!d->Workflow.isNull())
     {
-    QObject::disconnect(d->Workflow, SIGNAL(currentStepChanged(ctkWorkflowStep*)), this, SLOT(onCurrentStepChanged(ctkWorkflowStep)));
-    QObject::disconnect(d->Workflow, SIGNAL(stepRegistered(ctkWorkflowStep*)), this, SLOT(onStepRegistered(ctkWorkflowStep)));
+    QObject::disconnect(d->Workflow.data(), SIGNAL(currentStepChanged(ctkWorkflowStep*)),
+                        this, SLOT(onCurrentStepChanged(ctkWorkflowStep)));
+    QObject::disconnect(d->Workflow.data(), SIGNAL(stepRegistered(ctkWorkflowStep*)),
+                        this, SLOT(onStepRegistered(ctkWorkflowStep)));
     }
 
-  d->Workflow = newWorkflow;
+  d->Workflow = QWeakPointer<ctkWorkflow>(newWorkflow);
 
-  if (d->Workflow)
+  if (!d->Workflow.isNull())
     {
-    foreach(ctkWorkflowStep* step, d->Workflow->steps())
+    foreach(ctkWorkflowStep* step, d->Workflow.data()->steps())
       {
       this->onStepRegistered(step);
       }