Selaa lähdekoodia

clean up ctkDICOMThumbnailListWidget, connect signal-slot in ctkDICOMAppWidget

nherlambang 14 vuotta sitten
vanhempi
commit
b8b561741d

+ 4 - 0
Applications/ctkDICOMViewer/ctkDICOMViewerMain.cpp

@@ -23,6 +23,7 @@
 #include <QTreeView>
 #include <QSettings>
 #include <QDir>
+#include <QResource>
 
 // CTK widget includes
 #include <ctkDICOMAppWidget.h>
@@ -46,6 +47,9 @@ int main(int argc, char** argv)
   app.setOrganizationDomain("commontk.org");
   app.setApplicationName("ctkDICOM");
 
+  // set up Qt resource files
+  QResource::registerResource("./Resources/ctkDICOMViewer.qrc");
+
   QSettings settings;
   QString databaseDirectory;
 

+ 1 - 1
CMakeLists.txt

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

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

@@ -25,6 +25,8 @@ SET(KIT_SRCS
   ctkDICOMAppWidget.h
   ctkDICOMThumbnailWidget.cpp
   ctkDICOMThumbnailWidget.h
+  ctkDICOMThumbnailListWidget.cpp
+  ctkDICOMThumbnailListWidget.h
   )
 
 # Headers that should run through moc
@@ -34,6 +36,7 @@ SET(KIT_MOC_SRCS
   ctkDICOMServerNodeWidget.h
   ctkDICOMAppWidget.h
   ctkDICOMThumbnailWidget.h
+  ctkDICOMThumbnailListWidget.h
   )
 
 # UI files - includes new widgets
@@ -45,6 +48,7 @@ SET(KIT_UI_FORMS
   Resources/UI/ctkDICOMQueryWidget.ui
   Resources/UI/ctkDICOMAppWidget.ui
   Resources/UI/ctkDICOMThumbnailWidget.ui
+  Resources/UI/ctkDICOMThumbnailListWidget.ui
 )
 
 # Resources

+ 13 - 4
Libs/DICOM/Widgets/Resources/UI/ctkDICOMAppWidget.ui

@@ -7,7 +7,7 @@
     <x>0</x>
     <y>0</y>
     <width>739</width>
-    <height>547</height>
+    <height>638</height>
    </rect>
   </property>
   <property name="sizePolicy">
@@ -108,7 +108,7 @@
     <item>
      <layout class="QHBoxLayout" name="viewerLayout">
       <item>
-       <widget class="QWidget" name="thumbnailsWidget" native="true">
+       <widget class="ctkDICOMThumbnailListWidget" name="thumbnailsWidget" native="true">
         <property name="minimumSize">
          <size>
           <width>0</width>
@@ -121,8 +121,8 @@
        <widget class="QWidget" name="previewWidget" native="true">
         <property name="minimumSize">
          <size>
-          <width>0</width>
-          <height>200</height>
+          <width>256</width>
+          <height>256</height>
          </size>
         </property>
        </widget>
@@ -152,6 +152,9 @@
    <property name="windowTitle">
     <string>toolBar</string>
    </property>
+   <property name="floatable">
+    <bool>true</bool>
+   </property>
    <attribute name="toolBarArea">
     <enum>TopToolBarArea</enum>
    </attribute>
@@ -203,6 +206,12 @@
     <signal>directoryChanged(QString)</signal>
    </slots>
   </customwidget>
+  <customwidget>
+   <class>ctkDICOMThumbnailListWidget</class>
+   <extends>QWidget</extends>
+   <header>ctkDICOMThumbnailListWidget.h</header>
+   <container>1</container>
+  </customwidget>
  </customwidgets>
  <resources/>
  <connections>

+ 42 - 3
Libs/DICOM/Widgets/Resources/UI/ctkDICOMThumbnailWidget.ui

@@ -6,14 +6,53 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>566</width>
-    <height>294</height>
+    <width>128</width>
+    <height>158</height>
    </rect>
   </property>
   <property name="windowTitle">
    <string>Form</string>
   </property>
-  <layout class="QVBoxLayout" name="verticalLayout_2"/>
+  <property name="styleSheet">
+   <string notr="true">background-color:white</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout_2">
+   <item>
+    <widget class="QLabel" name="textLabel">
+     <property name="minimumSize">
+      <size>
+       <width>0</width>
+       <height>24</height>
+      </size>
+     </property>
+     <property name="text">
+      <string/>
+     </property>
+     <property name="scaledContents">
+      <bool>false</bool>
+     </property>
+     <property name="alignment">
+      <set>Qt::AlignCenter</set>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QLabel" name="pixmapLabel">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+       <horstretch>128</horstretch>
+       <verstretch>128</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="text">
+      <string/>
+     </property>
+     <property name="alignment">
+      <set>Qt::AlignCenter</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
  </widget>
  <resources/>
  <connections/>

+ 27 - 3
Libs/DICOM/Widgets/ctkDICOMAppWidget.cpp

@@ -3,6 +3,7 @@
 #include <QTabBar>
 #include <QSettings>
 #include <QAction>
+#include <QModelIndex>
 
 // ctkDICOMWidgets includes
 #include "ctkDICOMDatabase.h"
@@ -13,6 +14,7 @@
 #include "ctkDirectoryButton.h"
 #include "ctkDICOMQueryRetrieveWidget.h"
 
+
 //logger
 #include <ctkLogger.h>
 static ctkLogger logger("org.commontk.DICOM.Widgets.ctkDICOMAppWidget");
@@ -40,10 +42,21 @@ ctkDICOMAppWidget::ctkDICOMAppWidget(QWidget* _parent):Superclass(_parent),
   Q_D(ctkDICOMAppWidget);  
 
   d->setupUi(this);
+  
+  //Set toolbar button style
+  d->toolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
 
   d->queryRetrieveWidget = new ctkDICOMQueryRetrieveWidget();
-
   connect(d->directoryButton, SIGNAL(directoryChanged(const QString&)), this, SLOT(onDatabaseDirectoryChanged(const QString&)));
+
+  //Set thumbnails width in thumbnail widget
+  d->thumbnailsWidget->setThumbnailWidth(128);
+  //Test add thumbnails
+  d->thumbnailsWidget->addTestThumbnail();
+
+  //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&)));
 }
 
 //----------------------------------------------------------------------------
@@ -57,7 +70,7 @@ ctkDICOMAppWidget::~ctkDICOMAppWidget()
 //----------------------------------------------------------------------------
 void ctkDICOMAppWidget::onDatabaseDirectoryChanged(const QString& directory)
 {
-  Q_D(ctkDICOMAppWidget);  
+  //Q_D(ctkDICOMAppWidget);  
 
   QSettings settings;
   settings.setValue("DatabaseDirectory", directory);
@@ -68,7 +81,7 @@ void ctkDICOMAppWidget::onDatabaseDirectoryChanged(const QString& directory)
 
 void ctkDICOMAppWidget::onAddToDatabase()
 {
-  Q_D(ctkDICOMAppWidget);
+  //Q_D(ctkDICOMAppWidget);
 
   //d->
 }
@@ -88,3 +101,14 @@ void ctkDICOMAppWidget::onQuery(){
   d->queryRetrieveWidget->show();
   d->queryRetrieveWidget->raise();
 }
+
+void ctkDICOMAppWidget::onDICOMModelSelected(const QModelIndex& index){
+  Q_D(ctkDICOMAppWidget);
+
+  //TODO: update thumbnails and previewer
+  d->thumbnailsWidget->setModelIndex(index);
+}
+
+void ctkDICOMAppWidget::onThumbnailSelected(const ctkDICOMThumbnailWidget& widget){
+  //TODO: update previewer
+}

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

@@ -26,7 +26,9 @@
 
 #include "ctkDICOMWidgetsExport.h"
 
+class QModelIndex;
 class ctkDICOMAppWidgetPrivate;
+class ctkDICOMThumbnailWidget;
 
 class CTK_DICOM_WIDGETS_EXPORT ctkDICOMAppWidget : public QMainWindow
 {
@@ -40,6 +42,9 @@ public slots:
     void onDatabaseDirectoryChanged(const QString& directory);
     void onAddToDatabase();
 
+    void onDICOMModelSelected(const QModelIndex& index);
+    void onThumbnailSelected(const ctkDICOMThumbnailWidget& widget);
+
     void onImport();
     void onExport();
     void onQuery();

+ 48 - 36
Libs/DICOM/Widgets/ctkDICOMThumbnailListWidget.cpp

@@ -15,13 +15,20 @@
 class ctkDICOMThumbnailListWidgetPrivate: public Ui_ctkDICOMThumbnailListWidget
 {
 public:
-  ctkDICOMThumbnailListWidgetPrivate(){}
+  ctkDICOMThumbnailListWidgetPrivate(ctkDICOMThumbnailListWidget* parent): q_ptr(parent){
+    
+  }
 
+  void clearAllThumbnails();
+  void addThumbnail(ctkDICOMThumbnailWidget* widget);
   void rearrangeThumbnails();
 
   QList<ctkDICOMThumbnailWidget*> thumbnailList;
   int maxColumnNum;
   int thumbnailWidth;
+
+  ctkDICOMThumbnailListWidget* const q_ptr;
+  Q_DECLARE_PUBLIC(ctkDICOMThumbnailListWidget);
 };
 
 //----------------------------------------------------------------------------
@@ -39,7 +46,8 @@ void ctkDICOMThumbnailListWidgetPrivate::rearrangeThumbnails(){
   int row = 0;
   int column = 0;
   for(int i = 0; i < count; i++){
-    this->thumbnailLayout->addWidget(this->thumbnailList.at(i), row, column);
+    ctkDICOMThumbnailWidget* widget = this->thumbnailList.at(i);
+    this->thumbnailLayout->addWidget(widget, row, column);
     column++;
     if(column >= this->maxColumnNum){
       column = 0;
@@ -48,12 +56,35 @@ void ctkDICOMThumbnailListWidgetPrivate::rearrangeThumbnails(){
   }
 }
 
+void ctkDICOMThumbnailListWidgetPrivate::addThumbnail(ctkDICOMThumbnailWidget* widget){
+  Q_Q(ctkDICOMThumbnailListWidget);
+
+  if(widget == NULL)return;
+
+  this->thumbnailList.push_back(widget);
+
+  q->connect(widget, SIGNAL(selected(const ctkDICOMThumbnailWidget&)), q,  SIGNAL(selected(const ctkDICOMThumbnailWidget&)));
+}
+
+void ctkDICOMThumbnailListWidgetPrivate::clearAllThumbnails(){
+  int count = this->thumbnailList.count();
+
+  // clear all thumbnails from layout
+  for(int i = 0; i < count; i++){
+    QWidget* widget = this->thumbnailList.at(i);
+    this->thumbnailLayout->removeWidget(widget);
+    widget->deleteLater();
+  }
+
+  this->thumbnailList.clear();
+}
+
 //----------------------------------------------------------------------------
 // ctkDICOMThumbnailListWidget methods
 
 //----------------------------------------------------------------------------
 ctkDICOMThumbnailListWidget::ctkDICOMThumbnailListWidget(QWidget* _parent):Superclass(_parent), 
-  d_ptr(new ctkDICOMThumbnailListWidgetPrivate)
+									   d_ptr(new ctkDICOMThumbnailListWidgetPrivate(this))
 {
   Q_D(ctkDICOMThumbnailListWidget);
   
@@ -67,45 +98,19 @@ ctkDICOMThumbnailListWidget::~ctkDICOMThumbnailListWidget()
 {
 }
 
-void ctkDICOMThumbnailListWidget::clearThumbnail(){
+void ctkDICOMThumbnailListWidget::addTestThumbnail(int count){
   Q_D(ctkDICOMThumbnailListWidget);
-  
-  int count = d->thumbnailList.count();
-
-  // clear all thumbnails from layout
-  for(int i = 0; i < count; i++){
-    d->thumbnailLayout->removeWidget(d->thumbnailList.at(i));
-  }
-
-  d->thumbnailList.clear();
-}
-
-void ctkDICOMThumbnailListWidget::addThumbnail(ctkDICOMThumbnailWidget* widget){
-  Q_D(ctkDICOMThumbnailListWidget);
-  if(widget == NULL)return;
-
-  d->thumbnailList.push_back(widget);
-
-  int count = d->thumbnailList.count();
-
-  int lastRow = (count/d->maxColumnNum);
-  int lastColumn = (count%d->maxColumnNum);
-
-  int nextRow = (lastRow+((lastColumn+1)/d->maxColumnNum));
-  int nextColumn = (lastColumn+1)%d->maxColumnNum;
-
-  d->thumbnailLayout->addWidget(widget, nextRow, nextColumn);
-}
-
-void ctkDICOMThumbnailListWidget::addTestThumbnail(){
-  Q_D(ctkDICOMThumbnailListWidget);
-  for(int i = 0; i<11; i++){
+  for(int i = 0; i<count; i++){
     ctkDICOMThumbnailWidget* widget = new ctkDICOMThumbnailWidget(this);
+    QPixmap pixmap(64, 64);
+    pixmap.fill(Qt::blue);
     QString text("Thumbnail: ");
     widget->setMaximumWidth(d->thumbnailWidth);
     widget->setText(text);
-    this->addThumbnail(widget);
+    widget->setPixmap(pixmap);
+    d->addThumbnail(widget);
   }
+  d->rearrangeThumbnails();
 }
 
 void ctkDICOMThumbnailListWidget::setThumbnailWidth(int width){
@@ -124,3 +129,10 @@ void ctkDICOMThumbnailListWidget::resizeEvent ( QResizeEvent * event ){
   d->rearrangeThumbnails();
 }
 
+void ctkDICOMThumbnailListWidget::setModelIndex(const QModelIndex &index){
+  Q_D(ctkDICOMThumbnailListWidget);
+
+  d->clearAllThumbnails();
+  this->addTestThumbnail(index.model()->rowCount(index));
+  
+}

+ 8 - 7
Libs/DICOM/Widgets/ctkDICOMThumbnailListWidget.h

@@ -26,12 +26,13 @@
 
 #include "ctkDICOMWidgetsExport.h"
 
+class QModelIndex;
 class ctkDICOMThumbnailListWidgetPrivate;
-
 class ctkDICOMThumbnailWidget;
 
 class CTK_DICOM_WIDGETS_EXPORT ctkDICOMThumbnailListWidget : public QWidget
 {
+  Q_OBJECT
 public:
   typedef QWidget Superclass;
   explicit ctkDICOMThumbnailListWidget(QWidget* parent=0);
@@ -39,19 +40,19 @@ public:
 
   void setThumbnailWidth(int width);
 
-  void addTestThumbnail();
+  void addTestThumbnail(int count = 10);
+  void setModelIndex(const QModelIndex& index);
   
 protected:
   QScopedPointer<ctkDICOMThumbnailListWidgetPrivate> d_ptr;
 
-  void clearThumbnail();
-  void addThumbnail(ctkDICOMThumbnailWidget* widget);
-
-  virtual void resizeEvent(QResizeEvent * event);
-  
+  virtual void resizeEvent(QResizeEvent * event); 
 private:
   Q_DECLARE_PRIVATE(ctkDICOMThumbnailListWidget);
   Q_DISABLE_COPY(ctkDICOMThumbnailListWidget);
+
+signals:
+  void selected(const ctkDICOMThumbnailWidget& widget);
 };
 
 #endif

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

@@ -35,3 +35,18 @@ ctkDICOMThumbnailWidget::~ctkDICOMThumbnailWidget()
 {
 }
 
+void ctkDICOMThumbnailWidget::setText(QString &text){
+  Q_D(ctkDICOMThumbnailWidget);
+
+  d->textLabel->setText(text);
+}
+
+void ctkDICOMThumbnailWidget::setPixmap(QPixmap &pixmap){
+  Q_D(ctkDICOMThumbnailWidget);
+
+  d->pixmapLabel->setPixmap(pixmap);
+}
+
+void ctkDICOMThumbnailWidget::mousePressEvent(QMouseEvent* event){
+  emit selected(*this);
+}

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

@@ -30,17 +30,26 @@ class ctkDICOMThumbnailWidgetPrivate;
 
 class CTK_DICOM_WIDGETS_EXPORT ctkDICOMThumbnailWidget : public QWidget
 {
+  Q_OBJECT
 public:
   typedef QWidget Superclass;
   explicit ctkDICOMThumbnailWidget(QWidget* parent=0);
   virtual ~ctkDICOMThumbnailWidget();
+
+  void setText(QString& text);
+  void setPixmap(QPixmap& pixmap);
   
 protected:
   QScopedPointer<ctkDICOMThumbnailWidgetPrivate> d_ptr;
 
+  virtual void mousePressEvent(QMouseEvent* event);
+  
 private:
   Q_DECLARE_PRIVATE(ctkDICOMThumbnailWidget);
   Q_DISABLE_COPY(ctkDICOMThumbnailWidget);
+
+signals:
+  void selected(const ctkDICOMThumbnailWidget& widget);
 };
 
 #endif