Explorar el Código

Pass database as a QSharedPointer

Allows the database instance to be used by a widget or
other subclass even after caller might have been destroyed
(i.e. if query/retrieve widget lives after the ctkDICOMViewer
is closed.
Steve Pieper hace 14 años
padre
commit
6878cb7355

+ 6 - 2
Applications/ctkDICOM/ctkDICOMMain.cpp

@@ -24,6 +24,9 @@
 #include <QSettings>
 #include <QDir>
 
+// CTK Core
+#include <ctkDICOMDatabase.h>
+
 // CTK widget includes
 #include <ctkDICOMQueryRetrieveWidget.h>
 
@@ -75,10 +78,11 @@ int main(int argc, char** argv)
 
   QString databaseFileName = databaseDirectory + QString("/ctkDICOM.sql");
 
+  QSharedPointer<ctkDICOMDatabase> dicomDatabase = QSharedPointer<ctkDICOMDatabase> (new ctkDICOMDatabase);
+
   ctkDICOMQueryRetrieveWidget queryRetrieve;
 
-  queryRetrieve.setRetrieveDatabaseFileName(databaseFileName);
-  queryRetrieve.setRetrieveDirectory(databaseDirectory);
+  queryRetrieve.setRetrieveDatabase(dicomDatabase);
 
   queryRetrieve.show();
   queryRetrieve.raise();

+ 9 - 8
Libs/DICOM/Widgets/ctkDICOMAppWidget.cpp

@@ -32,7 +32,7 @@ public:
   ctkDICOMImportWidget* ImportWidget;
   ctkDICOMQueryRetrieveWidget* QueryRetrieveWidget;
 
-  ctkDICOMDatabase DICOMDatabase;
+  QSharedPointer<ctkDICOMDatabase> DICOMDatabase;
   ctkDICOMModel DICOMModel;
 };
 
@@ -40,7 +40,8 @@ public:
 // ctkDICOMAppWidgetPrivate methods
 
 ctkDICOMAppWidgetPrivate::ctkDICOMAppWidgetPrivate(){
-
+  
+  DICOMDatabase = QSharedPointer<ctkDICOMDatabase> (new ctkDICOMDatabase);
 }
 
 //----------------------------------------------------------------------------
@@ -93,23 +94,23 @@ void ctkDICOMAppWidget::setDatabaseDirectory(const QString& directory)
   settings.sync();
 
   //close the active DICOM database
-  d->DICOMDatabase.closeDatabase();
+  d->DICOMDatabase->closeDatabase();
   
   //open DICOM database on the directory
   QString databaseFileName = directory + QString("/ctkDICOM.sql");
-  try { d->DICOMDatabase.openDatabase( databaseFileName ); }
+  try { d->DICOMDatabase->openDatabase( databaseFileName ); }
   catch (std::exception e)
   {
-    std::cerr << "Database error: " << qPrintable(d->DICOMDatabase.GetLastError()) << "\n";
-    d->DICOMDatabase.closeDatabase();
+    std::cerr << "Database error: " << qPrintable(d->DICOMDatabase->GetLastError()) << "\n";
+    d->DICOMDatabase->closeDatabase();
     return;
   }
   
-  d->DICOMModel.setDatabase(d->DICOMDatabase.database());
+  d->DICOMModel.setDatabase(d->DICOMDatabase->database());
   d->treeView->setModel(&d->DICOMModel);
 
   //pass DICOM database instance to Import widget
-  d->ImportWidget->setDICOMDatabase(&d->DICOMDatabase);
+  d->ImportWidget->setDICOMDatabase(d->DICOMDatabase);
 }
 
 void ctkDICOMAppWidget::onAddToDatabase()

+ 2 - 2
Libs/DICOM/Widgets/ctkDICOMImportWidget.cpp

@@ -19,7 +19,7 @@ public:
 
   QFileSystemModel* FileSystemModel;
 
-  ctkDICOMDatabase* DICOMDatabase;
+  QSharedPointer<ctkDICOMDatabase> DICOMDatabase;
 
 };
 
@@ -71,7 +71,7 @@ void ctkDICOMImportWidget::onTopDirectoryChanged(const QString& path){
   d->directoryList->setRootIndex(d->FileSystemModel->index(path));
 }
 
-void ctkDICOMImportWidget::setDICOMDatabase(ctkDICOMDatabase* database){
+void ctkDICOMImportWidget::setDICOMDatabase(QSharedPointer<ctkDICOMDatabase> database){
   Q_D(ctkDICOMImportWidget);
 
   d->DICOMDatabase = database;

+ 1 - 1
Libs/DICOM/Widgets/ctkDICOMImportWidget.h

@@ -38,7 +38,7 @@ public:
   explicit ctkDICOMImportWidget(QWidget* parent=0);
   virtual ~ctkDICOMImportWidget();
 
-  void setDICOMDatabase(ctkDICOMDatabase* database);
+  void setDICOMDatabase(QSharedPointer<ctkDICOMDatabase> database);
 
 protected:
   QScopedPointer<ctkDICOMImportWidgetPrivate> d_ptr;

+ 25 - 32
Libs/DICOM/Widgets/ctkDICOMQueryRetrieveWidget.cpp

@@ -28,10 +28,11 @@ class ctkDICOMQueryRetrieveWidgetPrivate: public Ui_ctkDICOMQueryRetrieveWidget
 public:
   ctkDICOMQueryRetrieveWidgetPrivate(){}
 
-  QMap<QString, ctkDICOMQuery*> queriesByServer;
-  QMap<QString, ctkDICOMQuery*> queriesByStudyUID;
-  QMap<QString, ctkDICOMRetrieve*> retrievalsByStudyUID;
-  ctkDICOMDatabase queryResultDatabase;
+  QMap<QString, ctkDICOMQuery*> QueriesByServer;
+  QMap<QString, ctkDICOMQuery*> QueriesByStudyUID;
+  QMap<QString, ctkDICOMRetrieve*> RetrievalsByStudyUID;
+  ctkDICOMDatabase QueryResultDatabase;
+  QSharedPointer<ctkDICOMDatabase> RetrieveDatabase;
   ctkDICOMModel model;
 };
 
@@ -60,19 +61,11 @@ ctkDICOMQueryRetrieveWidget::~ctkDICOMQueryRetrieveWidget()
 }
 
 //----------------------------------------------------------------------------
-void ctkDICOMQueryRetrieveWidget::setRetrieveDirectory(const QString& directory)
+void ctkDICOMQueryRetrieveWidget::setRetrieveDatabase(QSharedPointer<ctkDICOMDatabase> dicomDatabase)
 {
-  QSettings settings;
-  settings.setValue("RetrieveDirectory", directory);
-  settings.sync();
-}
+  Q_D(ctkDICOMQueryRetrieveWidget);
 
-//----------------------------------------------------------------------------
-void ctkDICOMQueryRetrieveWidget::setRetrieveDatabaseFileName(const QString& fileName)
-{
-  QSettings settings;
-  settings.setValue("RetrieveDatabaseFileName", fileName);
-  settings.sync();
+  d->RetrieveDatabase = dicomDatabase;
 }
 
 //----------------------------------------------------------------------------
@@ -83,11 +76,11 @@ void ctkDICOMQueryRetrieveWidget::processQuery()
   d->RetrieveButton->setEnabled(false);
   
   // create a database in memory to hold query results
-  try { d->queryResultDatabase.openDatabase( ":memory:" ); }
+  try { d->QueryResultDatabase.openDatabase( ":memory:" ); }
   catch (std::exception e)
   {
-    logger.error ( "Database error: " + d->queryResultDatabase.GetLastError() );
-    d->queryResultDatabase.closeDatabase();
+    logger.error ( "Database error: " + d->QueryResultDatabase.GetLastError() );
+    d->QueryResultDatabase.closeDatabase();
     return;
   }
 
@@ -99,35 +92,35 @@ void ctkDICOMQueryRetrieveWidget::processQuery()
     if ( parameters["CheckState"] == Qt::Checked )
     {
       // create a query for the current server
-      d->queriesByServer[server] = new ctkDICOMQuery;
-      d->queriesByServer[server]->setCallingAETitle(d->ServerNodeWidget->callingAETitle());
-      d->queriesByServer[server]->setCalledAETitle(parameters["AETitle"].toString());
-      d->queriesByServer[server]->setHost(parameters["Address"].toString());
-      d->queriesByServer[server]->setPort(parameters["Port"].toInt());
+      d->QueriesByServer[server] = new ctkDICOMQuery;
+      d->QueriesByServer[server]->setCallingAETitle(d->ServerNodeWidget->callingAETitle());
+      d->QueriesByServer[server]->setCalledAETitle(parameters["AETitle"].toString());
+      d->QueriesByServer[server]->setHost(parameters["Address"].toString());
+      d->QueriesByServer[server]->setPort(parameters["Port"].toInt());
 
       // populate the query with the current search options
-      d->queriesByServer[server]->setFilters( d->QueryWidget->parameters() );
+      d->QueriesByServer[server]->setFilters( d->QueryWidget->parameters() );
 
       try
       {
         // run the query against the selected server and put results in database
-        d->queriesByServer[server]->query ( d->queryResultDatabase );
+        d->QueriesByServer[server]->query ( d->QueryResultDatabase );
       }
       catch (std::exception e)
       {
         logger.error ( "Query error: " + parameters["Name"].toString() );
       }
 
-      foreach( QString studyUID, d->queriesByServer[server]->studyInstanceUIDQueried() )
+      foreach( QString studyUID, d->QueriesByServer[server]->studyInstanceUIDQueried() )
       {
-        d->queriesByStudyUID[studyUID] = d->queriesByServer[server];
+        d->QueriesByStudyUID[studyUID] = d->QueriesByServer[server];
       }
     }
   }
   
   // checkable headers - allow user to select the patient/studies to retrieve
   d->results->setModel(&d->model);
-  d->model.setDatabase(d->queryResultDatabase.database());
+  d->model.setDatabase(d->QueryResultDatabase.database());
 
   d->model.setHeaderData(0, Qt::Horizontal, Qt::Unchecked, Qt::CheckStateRole);
   QHeaderView* previousHeaderView = d->results->header();
@@ -150,12 +143,12 @@ void ctkDICOMQueryRetrieveWidget::processRetrieve()
 
   QMap<QString,QVariant> serverParameters = d->ServerNodeWidget->parameters();
 
-  foreach( QString studyUID, d->queriesByStudyUID.keys() )
+  foreach( QString studyUID, d->QueriesByStudyUID.keys() )
   {
-    logger.debug("need to retrieve " + studyUID + " from " + d->queriesByStudyUID[studyUID]->host());
-    ctkDICOMQuery *query = d->queriesByStudyUID[studyUID];
+    logger.debug("need to retrieve " + studyUID + " from " + d->QueriesByStudyUID[studyUID]->host());
+    ctkDICOMQuery *query = d->QueriesByStudyUID[studyUID];
     ctkDICOMRetrieve *retrieve = new ctkDICOMRetrieve;
-    d->retrievalsByStudyUID[studyUID] = retrieve;
+    d->RetrievalsByStudyUID[studyUID] = retrieve;
     retrieve->setCallingAETitle( query->callingAETitle() );
     retrieve->setCalledAETitle( query->calledAETitle() );
     retrieve->setCalledPort( query->port() );

+ 6 - 3
Libs/DICOM/Widgets/ctkDICOMQueryRetrieveWidget.h

@@ -21,10 +21,14 @@
 #ifndef __ctkDICOMQueryRetrieveWidget_h
 #define __ctkDICOMQueryRetrieveWidget_h
 
+#include "ctkDICOMWidgetsExport.h"
+
 // Qt includes 
 #include <QWidget>
 
-#include "ctkDICOMWidgetsExport.h"
+
+// CTK includes
+#include <ctkDICOMDatabase.h>
 
 class ctkDICOMQueryRetrieveWidgetPrivate;
 
@@ -37,8 +41,7 @@ public:
   virtual ~ctkDICOMQueryRetrieveWidget();
 
 public slots:
-    void setRetrieveDirectory(const QString& directory);
-    void setRetrieveDatabaseFileName(const QString& fileName);
+    void setRetrieveDatabase(QSharedPointer<ctkDICOMDatabase> retrieveDatabase);
     void processQuery();
     void processRetrieve();