Browse Source

ENH:add ctkDICOMAppWidget and ctkDICOMViewer application

nherlambang 14 years ago
parent
commit
c9292857da

+ 40 - 0
Applications/ctkDICOMViewer/CMakeLists.txt

@@ -0,0 +1,40 @@
+PROJECT(ctkDICOMViewer)
+
+#
+# See CTK/CMake/ctkMacroBuildApp.cmake for details
+#
+  
+# Source files
+SET(KIT_SRCS
+  ctkDICOMViewerMain.cpp
+  )
+
+# Headers that should run through moc
+SET(KIT_MOC_SRCS
+  )
+
+# UI files
+SET(KIT_UI_FORMS
+)
+
+# Resources
+SET(KIT_resources
+)
+
+# Target libraries - See CMake/ctkMacroGetTargetLibraries.cmake
+# The following macro will read the target libraries from the file 'target_libraries.cmake'
+ctkMacroGetTargetLibraries(KIT_target_libraries)
+
+ctkMacroBuildApp(
+  NAME ${PROJECT_NAME}
+  SRCS ${KIT_SRCS}
+  MOC_SRCS ${KIT_MOC_SRCS}
+  UI_FORMS ${KIT_UI_FORMS}
+  TARGET_LIBRARIES ${KIT_target_libraries}
+  RESOURCES ${KIT_resources}
+  )
+
+# Testing
+IF(BUILD_TESTING)
+  #ADD_SUBDIRECTORY(Testing)
+ENDIF(BUILD_TESTING)

+ 1 - 0
Applications/ctkDICOMViewer/Testing/CMakeLists.txt

@@ -0,0 +1 @@
+ADD_SUBDIRECTORY(Cpp)

+ 27 - 0
Applications/ctkDICOMViewer/Testing/Cpp/CMakeLists.txt

@@ -0,0 +1,27 @@
+SET(KIT ${PROJECT_NAME})
+
+CREATE_TEST_SOURCELIST(Tests ${KIT}CppTests.cpp
+  )
+
+SET (TestsToRun ${Tests})
+REMOVE (TestsToRun ${KIT}CppTests.cpp)
+
+SET(LIBRARY_NAME ${PROJECT_NAME})
+
+ADD_EXECUTABLE(${KIT}CppTests ${Tests})
+TARGET_LINK_LIBRARIES(${KIT}CppTests ${LIBRARY_NAME})
+
+SET( KIT_TESTS ${CPP_TEST_PATH}/${KIT}CppTests)
+IF(WIN32)
+  SET(KIT_TESTS ${CPP_TEST_PATH}/${CMAKE_BUILD_TYPE}/${KIT}CppTests)
+ENDIF(WIN32)
+
+MACRO( SIMPLE_TEST  TESTNAME )
+  ADD_TEST( ${TESTNAME} ${KIT_TESTS} ${TESTNAME} )
+  SET_PROPERTY(TEST ${TESTNAME} PROPERTY LABELS ${PROJECT_NAME})
+ENDMACRO( SIMPLE_TEST  )
+
+#
+# Add Tests
+#
+

+ 107 - 0
Applications/ctkDICOMViewer/ctkDICOMViewerMain.cpp

@@ -0,0 +1,107 @@
+/*=========================================================================
+
+  Library:   CTK
+
+  Copyright (c) Kitware Inc.
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+      http://www.commontk.org/LICENSE
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+=========================================================================*/
+
+// Qt includes
+#include <QApplication>
+#include <QTreeView>
+#include <QSettings>
+#include <QDir>
+
+// CTK widget includes
+#include <ctkDICOMAppWidget.h>
+
+// ctkDICOMCore includes
+#include "ctkDICOM.h"
+#include "ctkDICOMModel.h"
+
+// Logger
+#include "ctkLogger.h"
+
+// STD includes
+#include <iostream>
+
+int main(int argc, char** argv)
+{
+  ctkLogger::configure();
+  QApplication app(argc, argv);
+
+  app.setOrganizationName("commontk");
+  app.setOrganizationDomain("commontk.org");
+  app.setApplicationName("ctkDICOM");
+
+  QSettings settings;
+  QString databaseDirectory;
+
+  // set up the database 
+  if (argc > 1)
+    {
+    QString directory(argv[1]);
+    settings.setValue("DatabaseDirectory", directory);
+    settings.sync();
+    }
+
+  if ( settings.value("DatabaseDirectory", "") == "" )
+  {
+    databaseDirectory = QString("./ctkDICOM-Database");
+    std::cerr << "No DatabaseDirectory on command line or in settings.  Using \"" << databaseDirectory.toLatin1().data() << "\".\n";
+  } else
+  {
+    databaseDirectory = settings.value("DatabaseDirectory", "").toString();
+  }
+
+  QDir qdir(databaseDirectory);
+  if ( !qdir.exists(databaseDirectory) ) 
+  {
+    if ( !qdir.mkpath(databaseDirectory) )
+    {
+      std::cerr << "Could not create database directory \"" << databaseDirectory.toLatin1().data() << "\".\n";
+      return EXIT_FAILURE;
+    }
+  }
+
+  QString databaseFileName = databaseDirectory + QString("/ctkDICOM.sql");
+
+  ctkDICOM myCTK;
+  try { myCTK.openDatabase( databaseFileName ); }
+  catch (std::exception e)
+  {
+    std::cerr << "Database error: " << qPrintable(myCTK.GetLastError()) << "\n";
+    myCTK.closeDatabase();
+    return EXIT_FAILURE;
+  }
+
+  ctkDICOMModel model;
+  model.setDatabase(myCTK.database());
+  
+  ctkDICOMAppWidget DICOMApp;
+
+  QTreeView *treeView = DICOMApp.findChild<QTreeView *>("treeView");
+  if (!treeView)
+    {
+    std::cerr << "Could not access tree view from QueryRetrieve widget\n";
+    return EXIT_FAILURE;
+    }
+  treeView->setModel(&model);
+
+  DICOMApp.show();
+  DICOMApp.raise();
+
+  return app.exec();
+}

+ 9 - 0
Applications/ctkDICOMViewer/target_libraries.cmake

@@ -0,0 +1,9 @@
+#
+# See CMake/ctkMacroGetTargetLibraries.cmake
+# 
+# This file should list the libraries required to build the current CTK application.
+# 
+
+SET(target_libraries
+  CTKDICOMWidgets
+  )

+ 1 - 0
CMakeLists.txt

@@ -332,6 +332,7 @@ SET(CTK_APPLICATIONS
   ctkDICOMDemoSCU:OFF
   ctkDICOMQuery:OFF
   ctkDICOMRetrieve:OFF
+  ctkDICOMViewer:ON
   ctkExampleHost:OFF
   ctkExampleHostedApp:OFF
   ctkPluginBrowser:OFF

+ 8 - 0
Libs/DICOM/Widgets/CMakeLists.txt

@@ -21,6 +21,10 @@ SET(KIT_SRCS
   ctkDICOMQueryWidget.h
   ctkDICOMQueryResultsTabWidget.cpp
   ctkDICOMQueryResultsTabWidget.h
+  ctkDICOMAppWidget.cpp
+  ctkDICOMAppWidget.h
+  ctkDICOMThumbnailWidget.cpp
+  ctkDICOMThumbnailWidget.h
   )
 
 # Headers that should run through moc
@@ -28,6 +32,8 @@ SET(KIT_MOC_SRCS
   ctkDICOMQueryRetrieveWidget.h
   ctkDICOMDirectoryListWidget.h
   ctkDICOMServerNodeWidget.h
+  ctkDICOMAppWidget.h
+  ctkDICOMThumbnailWidget.h
   )
 
 # UI files - includes new widgets
@@ -37,6 +43,8 @@ SET(KIT_UI_FORMS
   Resources/UI/ctkDICOMQueryRetrieveWidget.ui
   Resources/UI/ctkDICOMServerNodeWidget.ui
   Resources/UI/ctkDICOMQueryWidget.ui
+  Resources/UI/ctkDICOMAppWidget.ui
+  Resources/UI/ctkDICOMThumbnailWidget.ui
 )
 
 # Resources

+ 265 - 0
Libs/DICOM/Widgets/Resources/UI/ctkDICOMAppWidget.ui

@@ -0,0 +1,265 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ctkDICOMAppWidget</class>
+ <widget class="QMainWindow" name="ctkDICOMAppWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>739</width>
+    <height>547</height>
+   </rect>
+  </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+    <horstretch>0</horstretch>
+    <verstretch>0</verstretch>
+   </sizepolicy>
+  </property>
+  <property name="windowTitle">
+   <string>ctkDICOMAppWidget</string>
+  </property>
+  <widget class="QWidget" name="centralwidget">
+   <layout class="QVBoxLayout" name="verticalLayout">
+    <item>
+     <layout class="QHBoxLayout" name="topLayout">
+      <item>
+       <widget class="QLabel" name="label">
+        <property name="maximumSize">
+         <size>
+          <width>100</width>
+          <height>20</height>
+         </size>
+        </property>
+        <property name="text">
+         <string>LocalDatabase:</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="ctkDirectoryButton" name="directoryButton" native="true">
+        <property name="minimumSize">
+         <size>
+          <width>200</width>
+          <height>20</height>
+         </size>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <spacer name="horizontalSpacer">
+        <property name="orientation">
+         <enum>Qt::Horizontal</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>40</width>
+          <height>20</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+     </layout>
+    </item>
+    <item>
+     <layout class="QHBoxLayout" name="queryLayout">
+      <item>
+       <widget class="QTreeView" name="treeView">
+        <property name="alternatingRowColors">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <layout class="QVBoxLayout" name="searchOptionLayout">
+        <item>
+         <widget class="ctkDICOMQueryWidget" name="searchOption" native="true">
+          <property name="minimumSize">
+           <size>
+            <width>200</width>
+            <height>200</height>
+           </size>
+          </property>
+          <property name="maximumSize">
+           <size>
+            <width>400</width>
+            <height>16777215</height>
+           </size>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <spacer name="verticalSpacer">
+          <property name="orientation">
+           <enum>Qt::Vertical</enum>
+          </property>
+          <property name="sizeHint" stdset="0">
+           <size>
+            <width>20</width>
+            <height>40</height>
+           </size>
+          </property>
+         </spacer>
+        </item>
+       </layout>
+      </item>
+     </layout>
+    </item>
+    <item>
+     <layout class="QHBoxLayout" name="viewerLayout">
+      <item>
+       <widget class="QWidget" name="thumbnailsWidget" native="true">
+        <property name="minimumSize">
+         <size>
+          <width>0</width>
+          <height>200</height>
+         </size>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QWidget" name="previewWidget" native="true">
+        <property name="minimumSize">
+         <size>
+          <width>0</width>
+          <height>200</height>
+         </size>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </item>
+   </layout>
+  </widget>
+  <widget class="QMenuBar" name="menubar">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>739</width>
+     <height>22</height>
+    </rect>
+   </property>
+   <widget class="QMenu" name="menuFile">
+    <property name="title">
+     <string>File</string>
+    </property>
+   </widget>
+   <addaction name="menuFile"/>
+  </widget>
+  <widget class="QStatusBar" name="statusbar"/>
+  <widget class="QToolBar" name="toolBar">
+   <property name="windowTitle">
+    <string>toolBar</string>
+   </property>
+   <attribute name="toolBarArea">
+    <enum>TopToolBarArea</enum>
+   </attribute>
+   <attribute name="toolBarBreak">
+    <bool>false</bool>
+   </attribute>
+   <addaction name="actionImport"/>
+   <addaction name="actionExport"/>
+   <addaction name="actionQuery"/>
+  </widget>
+  <action name="actionImport">
+   <property name="text">
+    <string>Import</string>
+   </property>
+   <property name="toolTip">
+    <string>Import a DICOM file or folder</string>
+   </property>
+  </action>
+  <action name="actionExport">
+   <property name="text">
+    <string>Export</string>
+   </property>
+   <property name="toolTip">
+    <string>Export selected study/series to a DICOM folder</string>
+   </property>
+  </action>
+  <action name="actionQuery">
+   <property name="text">
+    <string>Query</string>
+   </property>
+   <property name="toolTip">
+    <string>Query and Retrieve DICOM studies from a DICOM node</string>
+   </property>
+  </action>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>ctkDICOMQueryWidget</class>
+   <extends>QWidget</extends>
+   <header>ctkDICOMQueryWidget.h</header>
+   <container>1</container>
+  </customwidget>
+  <customwidget>
+   <class>ctkDirectoryButton</class>
+   <extends>QWidget</extends>
+   <header>ctkDirectoryButton.h</header>
+   <container>1</container>
+   <slots>
+    <signal>directoryChanged(QString)</signal>
+   </slots>
+  </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>actionImport</sender>
+   <signal>triggered(bool)</signal>
+   <receiver>ctkDICOMAppWidget</receiver>
+   <slot>onImport()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>-1</x>
+     <y>-1</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>319</x>
+     <y>239</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>actionExport</sender>
+   <signal>triggered(bool)</signal>
+   <receiver>ctkDICOMAppWidget</receiver>
+   <slot>onExport()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>-1</x>
+     <y>-1</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>319</x>
+     <y>239</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>actionQuery</sender>
+   <signal>triggered(bool)</signal>
+   <receiver>ctkDICOMAppWidget</receiver>
+   <slot>onQuery()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>-1</x>
+     <y>-1</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>319</x>
+     <y>239</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+ <slots>
+  <signal>signal1()</signal>
+  <slot>onImport()</slot>
+  <slot>onExport()</slot>
+  <slot>onQuery()</slot>
+  <slot>onDatabaseDirectoryChaged(QString)</slot>
+ </slots>
+</ui>

+ 31 - 1
Libs/DICOM/Widgets/Resources/UI/ctkDICOMQueryRetrieveWidget.ui

@@ -136,7 +136,37 @@
     </widget>
    </item>
    <item>
-    <widget class="QTreeView" name="results"/>
+    <widget class="ctkDICOMQueryResultsTabWidget" name="results">
+     <property name="currentIndex">
+      <number>0</number>
+     </property>
+     <property name="tabsClosable">
+      <bool>true</bool>
+     </property>
+     <widget class="QWidget" name="tab">
+      <property name="enabled">
+       <bool>true</bool>
+      </property>
+      <property name="sizePolicy">
+       <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+        <horstretch>0</horstretch>
+        <verstretch>0</verstretch>
+       </sizepolicy>
+      </property>
+      <attribute name="title">
+       <string>Results</string>
+      </attribute>
+      <layout class="QHBoxLayout" name="horizontalLayout_2">
+       <item>
+        <widget class="QTreeView" name="treeView">
+         <property name="alternatingRowColors">
+          <bool>true</bool>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </widget>
+    </widget>
    </item>
   </layout>
  </widget>

+ 20 - 0
Libs/DICOM/Widgets/Resources/UI/ctkDICOMThumbnailWidget.ui

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ctkDICOMThumbnailWidget</class>
+ <widget class="QWidget" name="ctkDICOMThumbnailWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>566</width>
+    <height>294</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout_2"/>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>

+ 90 - 0
Libs/DICOM/Widgets/ctkDICOMAppWidget.cpp

@@ -0,0 +1,90 @@
+#include <QDebug>
+#include <QTreeView>
+#include <QTabBar>
+#include <QSettings>
+
+// ctkDICOMWidgets includes
+#include "ctkDICOM.h"
+#include "ctkDICOMModel.h"
+#include "ctkDICOMAppWidget.h"
+#include "ctkDICOMQueryResultsTabWidget.h"
+#include "Ui_ctkDICOMAppWidget.h"
+#include "ctkDirectoryButton.h"
+#include "ctkDICOMQueryRetrieveWidget.h"
+#include "QAction.h"
+
+//logger
+#include <ctkLogger.h>
+static ctkLogger logger("org.commontk.DICOM.Widgets.ctkDICOMAppWidget");
+
+//----------------------------------------------------------------------------
+class ctkDICOMAppWidgetPrivate: public Ui_ctkDICOMAppWidget
+{
+public:
+  ctkDICOMQueryRetrieveWidget* queryRetrieveWidget;
+
+  ctkDICOMAppWidgetPrivate(){}
+};
+
+//----------------------------------------------------------------------------
+// ctkDICOMAppWidgetPrivate methods
+
+
+//----------------------------------------------------------------------------
+// ctkDICOMAppWidget methods
+
+//----------------------------------------------------------------------------
+ctkDICOMAppWidget::ctkDICOMAppWidget(QWidget* _parent):Superclass(_parent), 
+  d_ptr(new ctkDICOMAppWidgetPrivate)
+{
+  Q_D(ctkDICOMAppWidget);  
+
+  d->setupUi(this);
+
+  d->queryRetrieveWidget = new ctkDICOMQueryRetrieveWidget();
+
+  connect(d->directoryButton, SIGNAL(directoryChanged(const QString&)), this, SLOT(onDatabaseDirectoryChanged(const QString&)));
+}
+
+//----------------------------------------------------------------------------
+ctkDICOMAppWidget::~ctkDICOMAppWidget()
+{
+  Q_D(ctkDICOMAppWidget);  
+
+  d->queryRetrieveWidget->deleteLater();
+}
+
+//----------------------------------------------------------------------------
+void ctkDICOMAppWidget::onDatabaseDirectoryChanged(const QString& directory)
+{
+  Q_D(ctkDICOMAppWidget);  
+
+  QSettings settings;
+  settings.setValue("DatabaseDirectory", directory);
+  settings.sync();
+
+  
+}
+
+void ctkDICOMAppWidget::onAddToDatabase()
+{
+  Q_D(ctkDICOMAppWidget);
+
+  //d->
+}
+
+//----------------------------------------------------------------------------
+void ctkDICOMAppWidget::onImport(){
+
+}
+
+void ctkDICOMAppWidget::onExport(){
+
+}
+
+void ctkDICOMAppWidget::onQuery(){
+  Q_D(ctkDICOMAppWidget);
+
+  d->queryRetrieveWidget->show();
+  d->queryRetrieveWidget->raise();
+}

+ 55 - 0
Libs/DICOM/Widgets/ctkDICOMAppWidget.h

@@ -0,0 +1,55 @@
+/*=========================================================================
+
+  Library:   CTK
+
+  Copyright (c) Kitware Inc.
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+      http://www.commontk.org/LICENSE
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+=========================================================================*/
+
+#ifndef __ctkDICOMAppWidget_h
+#define __ctkDICOMAppWidget_h
+
+// Qt includes 
+#include <QMainWindow>
+
+#include "ctkDICOMWidgetsExport.h"
+
+class ctkDICOMAppWidgetPrivate;
+
+class CTK_DICOM_WIDGETS_EXPORT ctkDICOMAppWidget : public QMainWindow
+{
+Q_OBJECT;
+public:
+  typedef QMainWindow Superclass;
+  explicit ctkDICOMAppWidget(QWidget* parent=0);
+  virtual ~ctkDICOMAppWidget();
+
+public slots:
+    void onDatabaseDirectoryChanged(const QString& directory);
+    void onAddToDatabase();
+
+    void onImport();
+    void onExport();
+    void onQuery();
+
+protected:
+  QScopedPointer<ctkDICOMAppWidgetPrivate> d_ptr;
+
+private:
+  Q_DECLARE_PRIVATE(ctkDICOMAppWidget);
+  Q_DISABLE_COPY(ctkDICOMAppWidget);
+};
+
+#endif

+ 37 - 0
Libs/DICOM/Widgets/ctkDICOMThumbnailWidget.cpp

@@ -0,0 +1,37 @@
+
+
+// ctkDICOMWidgets includes
+#include "ctkDICOMThumbnailWidget.h"
+#include "ui_ctkDICOMThumbnailWidget.h"
+
+// STD includes
+#include <iostream>
+
+//----------------------------------------------------------------------------
+class ctkDICOMThumbnailWidgetPrivate: public Ui_ctkDICOMThumbnailWidget
+{
+public:
+  ctkDICOMThumbnailWidgetPrivate(){}
+};
+
+//----------------------------------------------------------------------------
+// ctkDICOMThumbnailWidgetPrivate methods
+
+
+//----------------------------------------------------------------------------
+// ctkDICOMThumbnailWidget methods
+
+//----------------------------------------------------------------------------
+ctkDICOMThumbnailWidget::ctkDICOMThumbnailWidget(QWidget* _parent):Superclass(_parent), 
+  d_ptr(new ctkDICOMThumbnailWidgetPrivate)
+{
+  Q_D(ctkDICOMThumbnailWidget);
+  
+  d->setupUi(this);
+}
+
+//----------------------------------------------------------------------------
+ctkDICOMThumbnailWidget::~ctkDICOMThumbnailWidget()
+{
+}
+

+ 46 - 0
Libs/DICOM/Widgets/ctkDICOMThumbnailWidget.h

@@ -0,0 +1,46 @@
+/*=========================================================================
+
+  Library:   CTK
+
+  Copyright (c) Kitware Inc.
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+      http://www.commontk.org/LICENSE
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+=========================================================================*/
+
+#ifndef __ctkDICOMThumbnailWidget_h
+#define __ctkDICOMThumbnailWidget_h
+
+// Qt includes 
+#include <QWidget>
+
+#include "ctkDICOMWidgetsExport.h"
+
+class ctkDICOMThumbnailWidgetPrivate;
+
+class CTK_DICOM_WIDGETS_EXPORT ctkDICOMThumbnailWidget : public QWidget
+{
+public:
+  typedef QWidget Superclass;
+  explicit ctkDICOMThumbnailWidget(QWidget* parent=0);
+  virtual ~ctkDICOMThumbnailWidget();
+  
+protected:
+  QScopedPointer<ctkDICOMThumbnailWidgetPrivate> d_ptr;
+
+private:
+  Q_DECLARE_PRIVATE(ctkDICOMThumbnailWidget);
+  Q_DISABLE_COPY(ctkDICOMThumbnailWidget);
+};
+
+#endif

+ 2 - 2
Libs/PluginFramework/Testing/MetaTypeTestPlugins/pluginAttrPwd_test/pluginAttrPwd_test_de.ts

@@ -6,12 +6,12 @@
     <message>
         <location filename="ctkTestPluginMTAttrPwdActivator.cpp" line="29"/>
         <source>Object</source>
-        <translation>Objekt</translation>
+        <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="ctkTestPluginMTAttrPwdActivator.cpp" line="30"/>
         <source>My object class definition</source>
-        <translation>Meine Objektklassendefinition</translation>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 </TS>