Browse Source

Merge topic 'dicom-import'

Indexer is now triggered from the "Import" dialog of the viewer app.
Marco Nolden 14 years ago
parent
commit
996ab40361

+ 7 - 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,12 @@ int main(int argc, char** argv)
 
   QString databaseFileName = databaseDirectory + QString("/ctkDICOM.sql");
 
+  QSharedPointer<ctkDICOMDatabase> dicomDatabase = QSharedPointer<ctkDICOMDatabase> (new ctkDICOMDatabase);
+  dicomDatabase->openDatabase(databaseFileName);
+
   ctkDICOMQueryRetrieveWidget queryRetrieve;
 
-  queryRetrieve.setRetrieveDatabaseFileName(databaseFileName);
-  queryRetrieve.setRetrieveDirectory(databaseDirectory);
+  queryRetrieve.setRetrieveDatabase(dicomDatabase);
 
   queryRetrieve.show();
   queryRetrieve.raise();

+ 1 - 1
Applications/ctkDICOMIndexer/ctkDICOMIndexerMain.cpp

@@ -106,7 +106,7 @@ int main(int argc, char** argv)
   }
   catch (std::exception e)
   {
-    std::cerr << "Database error:" << qPrintable(myCTK.GetLastError());
+    std::cerr << "Database error:" << qPrintable(myCTK.lastError());
     myCTK.closeDatabase();
     return EXIT_FAILURE;
   }

+ 1 - 1
Applications/ctkDICOMQuery/ctkDICOMQueryMain.cpp

@@ -76,7 +76,7 @@ int main(int argc, char** argv)
   ctkDICOMDatabase myCTK;
   logger.debug ( "Opening database " + QString ( argv[1] ) );
   myCTK.openDatabase ( argv[1] );
-  logger.debug ( "Last error: " + myCTK.GetLastError() );
+  logger.debug ( "Last error: " + myCTK.lastError() );
   if ( myCTK.database().isOpen() ) 
     {
     logger.debug ( "Database is open" );

+ 4 - 1
Applications/ctkDICOMRetrieve/ctkDICOMRetrieveMain.cpp

@@ -97,11 +97,14 @@ int main(int argc, char** argv)
                 + "Host: " + Host + "\n"
                 + "CalledPort: " + QString::number ( CalledPort ) + "\n" );
 
+  QSharedPointer<ctkDICOMDatabase> dicomDatabase =  QSharedPointer<ctkDICOMDatabase> (new ctkDICOMDatabase);
+  dicomDatabase->openDatabase( OutputDirectory.absoluteFilePath(QString("ctkDICOM.sql")) );
+  retrieve.setDICOMDatabase( dicomDatabase );
 
   logger.info ( "Starting to retrieve" );
   try
     {
-    retrieve.retrieveStudy ( StudyUID, OutputDirectory );
+    retrieve.retrieveStudy ( StudyUID );
     }
   catch (std::exception e)
     {

+ 7 - 7
Libs/DICOM/Core/Testing/Cpp/ctkDICOMModelTest1.cpp

@@ -37,20 +37,20 @@ int ctkDICOMModelTest1( int argc, char * argv [] )
     if (!myCTK.initializeDatabase(argv[2]))
     {
       std::cerr << "Error when initializing the data base: " << argv[2]
-          << " error: " << myCTK.GetLastError().toStdString();
+          << " error: " << myCTK.lastError().toStdString();
     }
     /*
   QSqlQuery toto("SELECT PatientsName as 'Name tt' FROM Patients ORDER BY \"Name tt\" ASC", myCTK.database());
-  qDebug() << "toto: " << myCTK.GetLastError() ;
-  qDebug()<< toto.seek(0) << myCTK.GetLastError();
-  qDebug() << toto.value(0).toString() << myCTK.GetLastError();
+  qDebug() << "toto: " << myCTK.lastError() ;
+  qDebug()<< toto.seek(0) << myCTK.lastError();
+  qDebug() << toto.value(0).toString() << myCTK.lastError();
 
   QSqlQuery titi("SELECT StudyID as UID, StudyDescription as Name, ModalitiesInStudy as Scan, StudyDate as Date, AccessionNumber as Number, ReferringPhysician as Institution, ReferringPhysician as Referrer, PerformingPysiciansName as Performer FROM Studies WHERE PatientsUID='14'", myCTK.database());
-  qDebug() << "titi: " << titi.seek(0) << myCTK.GetLastError();
+  qDebug() << "titi: " << titi.seek(0) << myCTK.lastError();
   QSqlQuery tata("SELECT SeriesInstanceUID as UID, BodyPartExamined as Scan, SeriesDate as Date, AcquisitionNumber as Number FROM Series WHERE StudyInstanceUID='1.2.826.0.1.3680043.2.1125.1.73379483469717886505187028001198162'", myCTK.database());
-  qDebug() << "tata: " << tata.seek(0) << myCTK.GetLastError();
+  qDebug() << "tata: " << tata.seek(0) << myCTK.lastError();
   QSqlQuery tutu("SELECT Filename as UID, Filename as Name, SeriesInstanceUID as Date FROM Images WHERE SeriesInstanceUID='%1'", myCTK.database());
-  qDebug() << "tutu: " << tutu.seek(0) << myCTK.GetLastError();
+  qDebug() << "tutu: " << tutu.seek(0) << myCTK.lastError();
   */
 
     ctkModelTester tester;

+ 13 - 2
Libs/DICOM/Core/ctkDICOMDatabase.cpp

@@ -98,6 +98,7 @@ ctkDICOMDatabasePrivate::~ctkDICOMDatabasePrivate()
 void ctkDICOMDatabase::openDatabase(const QString databaseFile)
 {
   Q_D(ctkDICOMDatabase);
+  d->DatabaseFileName = databaseFile;
   d->Database = QSqlDatabase::addDatabase("QSQLITE","DICOM-DB");
   d->Database.setDatabaseName(databaseFile);
   if ( ! (d->Database.open()) )
@@ -137,18 +138,28 @@ ctkDICOMDatabase::~ctkDICOMDatabase()
 //----------------------------------------------------------------------------
 
 //------------------------------------------------------------------------------
-const QString ctkDICOMDatabase::GetLastError() const {
+const QString ctkDICOMDatabase::lastError() const {
   Q_D(const ctkDICOMDatabase);
   return d->LastError;
 }
 
 //------------------------------------------------------------------------------
-const QString ctkDICOMDatabase::GetDatabaseFilename() const {
+const QString ctkDICOMDatabase::databaseFilename() const {
   Q_D(const ctkDICOMDatabase);
   return d->DatabaseFileName;
 }
 
 //------------------------------------------------------------------------------
+const QString ctkDICOMDatabase::databaseDirectory() const {
+  QString databaseFile = databaseFilename();
+  if (!QFileInfo(databaseFile).isAbsolute())
+  {
+    databaseFile.prepend(QDir::currentPath() + "/");
+  }
+  return QFileInfo ( databaseFile ).absoluteDir().path();
+}
+
+//------------------------------------------------------------------------------
 const QSqlDatabase& ctkDICOMDatabase::database() const {
   Q_D(const ctkDICOMDatabase);
   return d->Database;

+ 3 - 2
Libs/DICOM/Core/ctkDICOMDatabase.h

@@ -39,8 +39,9 @@ public:
   virtual ~ctkDICOMDatabase();
 
   const QSqlDatabase& database() const;
-  const QString GetLastError() const;
-  const QString GetDatabaseFilename() const;
+  const QString lastError() const;
+  const QString databaseFilename() const;
+  const QString databaseDirectory() const;
 
   ///
   /// open the SQLite database in @param file. If the file does not

+ 1 - 7
Libs/DICOM/Core/ctkDICOMIndexer.cpp

@@ -397,13 +397,7 @@ void ctkDICOMIndexer::addDirectory(ctkDICOMDatabase& database, const QString& di
 
     if (createThumbnails)
     {
-      QString databaseFile = database.GetDatabaseFilename();
-      if (!QFileInfo(databaseFile).isAbsolute())
-      {
-        databaseFile.prepend(QDir::currentPath() + "/");
-      }
-
-      QString thumbnailBaseDir = QFileInfo ( databaseFile ).absoluteDir().path() + "/thumbs/";
+      QString thumbnailBaseDir =  database.databaseDirectory() + "/thumbs/";
       QString thumbnailFilename = thumbnailBaseDir + "/" + studySeriesDirectory + "/" + sopInstanceUID.c_str() + ".png";
       QFileInfo thumbnailInfo(thumbnailFilename);
       if ( ! ( thumbnailInfo.exists() && thumbnailInfo.lastModified() < QFileInfo(qfilename).lastModified() ) )

+ 15 - 8
Libs/DICOM/Core/ctkDICOMRetrieve.cpp

@@ -75,10 +75,11 @@ public:
   DcmSCU SCU;
   DcmDataset* parameters;
   QString MoveDestinationAETitle;
+  QSharedPointer<ctkDICOMDatabase> DICOMDatabase;
 
   // do the retrieve, handling both series and study retrieves
   enum RetrieveType { RetrieveSeries, RetrieveStudy };
-  void retrieve ( QString UID, QDir directory, RetrieveType retriveType );
+  void retrieve ( QString UID, RetrieveType retriveType );
 };
 
 //------------------------------------------------------------------------------
@@ -97,7 +98,7 @@ ctkDICOMRetrievePrivate::~ctkDICOMRetrievePrivate()
 }
 
 //------------------------------------------------------------------------------
-void ctkDICOMRetrievePrivate::retrieve ( QString UID, QDir directory, RetrieveType retriveType ) {
+void ctkDICOMRetrievePrivate::retrieve ( QString UID, RetrieveType retriveType ) {
 
   // Register the JPEG libraries in case we need them
   //   (registration only happens once, so it's okay to call repeatedly)
@@ -170,8 +171,7 @@ void ctkDICOMRetrievePrivate::retrieve ( QString UID, QDir directory, RetrieveTy
     logger.debug ( "Find succeded" );
 
     logger.debug ( "Making Output Directory" );
-    // Try to create the directory
-    directory.mkpath ( directory.absolutePath() );
+    QDir directory = QDir( DICOMDatabase->databaseDirectory() );
 
     if ( responses->begin() == responses->end() )
       {
@@ -323,18 +323,25 @@ const QString& ctkDICOMRetrieve::moveDestinationAETitle()
 }
 
 //------------------------------------------------------------------------------
-void ctkDICOMRetrieve::retrieveSeries ( QString seriesInstanceUID, QDir directory ) {
+void ctkDICOMRetrieve::setDICOMDatabase(QSharedPointer<ctkDICOMDatabase> dicomDatabase)
+{
+  Q_D(ctkDICOMRetrieve);
+  d->DICOMDatabase = dicomDatabase;
+}
+
+//------------------------------------------------------------------------------
+void ctkDICOMRetrieve::retrieveSeries ( QString seriesInstanceUID ) {
   Q_D(ctkDICOMRetrieve);
   logger.info ( "Starting retrieveSeries" );
-  d->retrieve ( seriesInstanceUID, directory, ctkDICOMRetrievePrivate::RetrieveSeries );
+  d->retrieve ( seriesInstanceUID, ctkDICOMRetrievePrivate::RetrieveSeries );
   return;
 }
 
 //------------------------------------------------------------------------------
-void ctkDICOMRetrieve::retrieveStudy ( QString studyInstanceUID, QDir directory ) {
+void ctkDICOMRetrieve::retrieveStudy ( QString studyInstanceUID ) {
   Q_D(ctkDICOMRetrieve);
   logger.info ( "Starting retrieveStudy" );
-  d->retrieve ( studyInstanceUID, directory, ctkDICOMRetrievePrivate::RetrieveStudy );
+  d->retrieve ( studyInstanceUID, ctkDICOMRetrievePrivate::RetrieveStudy );
   return;
 }
 

+ 9 - 3
Libs/DICOM/Core/ctkDICOMRetrieve.h

@@ -25,9 +25,13 @@
 // Qt includes 
 #include <QObject>
 #include <QDir>
+#include <QSharedPointer>
 
 #include "ctkDICOMCoreExport.h"
 
+// CTK Core includes
+#include "ctkDICOMDatabase.h"
+
 class ctkDICOMRetrievePrivate;
 class CTK_DICOM_CORE_EXPORT ctkDICOMRetrieve : public QObject
 {
@@ -49,10 +53,12 @@ public:
   int calledPort();
   void setMoveDestinationAETitle ( QString moveDestinationAETitle );
   const QString& moveDestinationAETitle();
-
+  
+  /// method for database
+  void setDICOMDatabase(QSharedPointer<ctkDICOMDatabase> dicomDatabase);
   // Could be a slot...
-  void retrieveSeries ( QString seriesInstanceUID, QDir directory );
-  void retrieveStudy ( QString studyInstanceUID, QDir directory );
+  void retrieveSeries ( QString seriesInstanceUID );
+  void retrieveStudy ( QString studyInstanceUID );
 
 protected:
   QScopedPointer<ctkDICOMRetrievePrivate> d_ptr;

+ 1 - 1
Libs/DICOM/Widgets/Testing/Cpp/ctkDICOMModelTest2.cpp

@@ -40,7 +40,7 @@ int ctkDICOMModelTest2( int argc, char * argv [] )
     if (!myCTK.initializeDatabase(argv[2]))
     {
       std::cerr << "Error when initializing the data base: " << argv[2]
-          << " error: " << myCTK.GetLastError().toStdString();
+          << " error: " << myCTK.lastError().toStdString();
     }
  
     ctkDICOMModel model;

+ 48 - 14
Libs/DICOM/Widgets/ctkDICOMAppWidget.cpp

@@ -8,14 +8,20 @@
 #include <QSettings>
 #include <QAction>
 #include <QModelIndex>
+#include <QCheckBox>
 
-// ctkDICOMWidgets includes
+// ctkDICOMCore includes
 #include "ctkDICOMDatabase.h"
+#include "ctkDICOMIndexer.h"
+
+// ctkDICOMWidgets includes
 #include "ctkDICOMModel.h"
 #include "ctkDICOMAppWidget.h"
 #include "ctkDICOMQueryResultsTabWidget.h"
 #include "ui_ctkDICOMAppWidget.h"
 #include "ctkDirectoryButton.h"
+#include "ctkFileDialog.h"
+
 #include "ctkDICOMQueryRetrieveWidget.h"
 #include "ctkDICOMImportWidget.h"
 
@@ -29,18 +35,22 @@ class ctkDICOMAppWidgetPrivate: public Ui_ctkDICOMAppWidget
 public:
   ctkDICOMAppWidgetPrivate();
 
-  ctkDICOMImportWidget* ImportWidget;
+  ctkFileDialog* ImportDialog;
   ctkDICOMQueryRetrieveWidget* QueryRetrieveWidget;
 
-  ctkDICOMDatabase DICOMDatabase;
+  QSharedPointer<ctkDICOMDatabase> DICOMDatabase;
   ctkDICOMModel DICOMModel;
+  QSharedPointer<ctkDICOMIndexer> DICOMIndexer;
+
 };
 
 //----------------------------------------------------------------------------
 // ctkDICOMAppWidgetPrivate methods
 
 ctkDICOMAppWidgetPrivate::ctkDICOMAppWidgetPrivate(){
-
+  
+  DICOMDatabase = QSharedPointer<ctkDICOMDatabase> (new ctkDICOMDatabase);
+  DICOMIndexer = QSharedPointer<ctkDICOMIndexer> (new ctkDICOMIndexer);
 }
 
 //----------------------------------------------------------------------------
@@ -62,7 +72,14 @@ ctkDICOMAppWidget::ctkDICOMAppWidget(QWidget* _parent):Superclass(_parent),
   connect(d->directoryButton, SIGNAL(directoryChanged(const QString&)), this, SLOT(setDatabaseDirectory(const QString&)));
 
   //Initialize import widget
-  d->ImportWidget = new ctkDICOMImportWidget();
+  d->ImportDialog = new ctkFileDialog();
+  QCheckBox* importCheckbox = new QCheckBox("Copy on import", d->ImportDialog);
+  d->ImportDialog->setBottomWidget(importCheckbox);
+  d->ImportDialog->setFileMode(QFileDialog::Directory);
+  d->ImportDialog->setLabelText(QFileDialog::Accept,"Import");
+  d->ImportDialog->setWindowTitle("Import DICOM files from directory ...");
+  d->ImportDialog->setWindowModality(Qt::ApplicationModal);
+
 
   //Set thumbnails width in thumbnail widget
   //d->thumbnailsWidget->setThumbnailWidth(128);
@@ -72,6 +89,8 @@ ctkDICOMAppWidget::ctkDICOMAppWidget(QWidget* _parent):Superclass(_parent),
   //connect signal and slots
   connect(d->treeView, SIGNAL(clicked(const QModelIndex&)), this, SLOT(onDICOMModelSelected(const QModelIndex &)));
   connect(d->thumbnailsWidget, SIGNAL(selected(const ctkDICOMThumbnailWidget&)), this, SLOT(onThumbnailSelected(const ctkDICOMThumbnailWidget&)));
+  connect(d->ImportDialog, SIGNAL(fileSelected(QString)),this,SLOT(onImportDirectory(QString)));
+
 }
 
 //----------------------------------------------------------------------------
@@ -80,7 +99,7 @@ ctkDICOMAppWidget::~ctkDICOMAppWidget()
   Q_D(ctkDICOMAppWidget);  
 
   d->QueryRetrieveWidget->deleteLater();
-  d->ImportWidget->deleteLater();
+  d->ImportDialog->deleteLater();
 }
 
 //----------------------------------------------------------------------------
@@ -93,23 +112,24 @@ 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->lastError()) << "\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->ImportDialog->setDICOMDatabase(d->DICOMDatabase);
+  d->directoryButton->setDirectory(directory);
 }
 
 void ctkDICOMAppWidget::onAddToDatabase()
@@ -123,8 +143,8 @@ void ctkDICOMAppWidget::onAddToDatabase()
 void ctkDICOMAppWidget::onImport(){
   Q_D(ctkDICOMAppWidget);
   
-  d->ImportWidget->show();
-  d->ImportWidget->raise();
+  d->ImportDialog->show();
+  d->ImportDialog->raise();
 }
 
 void ctkDICOMAppWidget::onExport(){
@@ -148,3 +168,17 @@ void ctkDICOMAppWidget::onDICOMModelSelected(const QModelIndex& index){
 void ctkDICOMAppWidget::onThumbnailSelected(const ctkDICOMThumbnailWidget& widget){
   //TODO: update previewer
 }
+void ctkDICOMAppWidget::onImportDirectory(QString directory)
+{
+  Q_D(ctkDICOMAppWidget);
+  if (QDir(directory).exists())
+  {
+    QCheckBox* copyOnImport = qobject_cast<QCheckBox*>(d->ImportDialog->bottomWidget());
+    QString targetDirectory;
+    if (copyOnImport->isEnabled())
+    {
+       targetDirectory = d->DICOMDatabase->databaseDirectory();
+    }
+    d->DICOMIndexer->addDirectory(*d->DICOMDatabase,directory,targetDirectory);
+  }
+}

+ 4 - 1
Libs/DICOM/Widgets/ctkDICOMAppWidget.h

@@ -50,7 +50,10 @@ public slots:
     void onQuery();
 
 protected:
-  QScopedPointer<ctkDICOMAppWidgetPrivate> d_ptr;
+    QScopedPointer<ctkDICOMAppWidgetPrivate> d_ptr;
+protected slots:
+    void onImportDirectory(QString directory);
+
 
 private:
   Q_DECLARE_PRIVATE(ctkDICOMAppWidget);

+ 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;

+ 27 - 33
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.lastError() );
+    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,13 @@ 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;
+    retrieve->setDICOMDatabase( d->RetrieveDatabase );
+    d->RetrievalsByStudyUID[studyUID] = retrieve;
     retrieve->setCallingAETitle( query->callingAETitle() );
     retrieve->setCalledAETitle( query->calledAETitle() );
     retrieve->setCalledPort( query->port() );
@@ -168,7 +162,7 @@ void ctkDICOMQueryRetrieveWidget::processRetrieve()
     logger.info ( "Starting to retrieve" );
     try
       {
-      retrieve->retrieveStudy ( studyUID, QDir("/tmp/ctk") );
+      retrieve->retrieveStudy ( studyUID );
       }
     catch (std::exception e)
       {

+ 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();