3D Slicer 结构的实例分析IGSReader

1.qSlicerIGSReaderModule.h

 1 #ifndef __qSlicerIGSReaderModule_h
 2 #define __qSlicerIGSReaderModule_h
 3  
 4 // SlicerQt includes
 5 #include "qSlicerLoadableModule.h" //模板类
 6  
 7 #include "qSlicerIGSReaderModuleExport.h" //捕获Unix和Windows操作系统之间的差异
 8  
 9 class qSlicerIGSReaderModulePrivate; //声明了一个类,但是该类没有在头文件中定义
10  
11 /// ingroup Slicer_QtModules_ExtensionTemplate
12 class Q_SLICER_QTMODULES_IGSREADER_EXPORT
13 qSlicerIGSReaderModule
14   : public qSlicerLoadableModule
15 {
16   Q_OBJECT
17 #ifdef Slicer_HAVE_QT5
18   Q_PLUGIN_METADATA(IID "org.slicer.modules.loadable.qSlicerLoadableModule/1.0");
19 #endif
20   Q_INTERFACES(qSlicerLoadableModule);
21  
22 public:
23  
24   typedef qSlicerLoadableModule Superclass;//类型重定义 方便使用
25   explicit qSlicerIGSReaderModule(QObject *parent=0); //显式的构造函数
26   virtual ~qSlicerIGSReaderModule();
27  
28   qSlicerGetTitleMacro(QTMODULE_TITLE);
29  
30   virtual QString helpText()const;
31   virtual QString acknowledgementText()const;
32   virtual QStringList contributors()const;
33  
34   virtual QIcon icon()const;
35  
36   virtual QStringList categories()const;
37   virtual QStringList dependencies() const;
38  
39 protected:
40  
41   /// 初始化模块,实现三维数据读/写功能
42   virtual void setup();
43  
44   /// 创建并返回与此模块相关的窗体表示
45   virtual qSlicerAbstractModuleRepresentation * createWidgetRepresentation();
46  
47   /// 创建并返回与此模块相关的逻辑连接
48   virtual vtkMRMLAbstractLogic* createLogic();
49 protected:
50   QScopedPointer<qSlicerIGSReaderModulePrivate> d_ptr;
51  
52 private:
53   Q_DECLARE_PRIVATE(qSlicerIGSReaderModule);
54   Q_DISABLE_COPY(qSlicerIGSReaderModule);
55  
56 };
57  
58 #endif
Notice:
1.explicit qSlicerIGSReaderModule(QObject *parent=0);
explicit约束构造函数进行显式转换,避免默认的隐式转换,提高代码可理解性。
http://blog.csdn.net/shenziheng1/article/details/78026883
2 .class Q_SLICER_QTMODULES_IGSREADER_EXPORT  qSlicerIGSReaderModule : public qSlicerLoadableModule {};
起初看到这样定义类有点懵,我们可以查看Q_SLICER_QTMODULES_IGSREADER_EXPORT ("qSlicerIGSReaderModuleExport.h"头文件中),有如下代码:
1 #if defined(qSlicerIGSReaderModule_EXPORTS)
2   #define Q_SLICER_QTMODULES_IGSREADER_EXPORT __declspec( dllexport )
3 #else
4   #define Q_SLICER_QTMODULES_IGSREADER_EXPORT __declspec( dllimport )
通过这一行我们可以了解到,其实就是定义了一个宏,该宏的作用是提供给外部应用程序或DLL使用,有点像extent的味道,但据说比extend的性能要好。
http://blog.csdn.net/clever101/article/details/5421782

2.qSlicerIGSReaderModule.cpp

 1 // IGSReader Logic includes:逻辑功能
 2 #include <vtkSlicerIGSReaderLogic.h>
 3  
 4 // IGSReader includes:总控与布局
 5 #include "qSlicerIGSReaderModule.h"
 6 #include "qSlicerIGSReaderModuleWidget.h"
 7  
 8 //-----------------------------------------------------------------------------
 9 #if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0))  //本项目使用的是qt-4.8.7就是比较低的版本
10 #include <QtPlugin> //Plug-in 机制
11 Q_EXPORT_PLUGIN2(qSlicerIGSReaderModule, qSlicerIGSReaderModule);
12 #endif
13  
14 //-----------------------------------------------------------------------------
15 /// ingroup Slicer_QtModules_ExtensionTemplate
16 class qSlicerIGSReaderModulePrivate //头文件中声明的类,在此处定义、实现
17 {
18 public:
19   qSlicerIGSReaderModulePrivate();
20 };
21  
22 //-----------------------------------------------------------------------------
23 // qSlicerIGSReaderModulePrivate methods
24  
25 //-----------------------------------------------------------------------------
26 qSlicerIGSReaderModulePrivate::qSlicerIGSReaderModulePrivate() //声明类构造函数
27 {
28 }
29  
30 //-----------------------------------------------------------------------------
31 // qSlicerIGSReaderModule methods 主类的方法
32  
33 //-----------------------------------------------------------------------------
34 qSlicerIGSReaderModule::qSlicerIGSReaderModule(QObject* _parent)
35   : Superclass(_parent)
36   , d_ptr(new qSlicerIGSReaderModulePrivate) //构造函数初始化
37 {
38 }
39 //-----------------------------------------------------------------------------
40 qSlicerIGSReaderModule::~qSlicerIGSReaderModule() //析构函数初始化
41 {
42 }
43 //-----------------------------------------------------------------------------
44 QString qSlicerIGSReaderModule::helpText() const
45 {
46   return "This is a loadable module that can be bundled in an extension";
47 }
48 //-----------------------------------------------------------------------------
49 QString qSlicerIGSReaderModule::acknowledgementText() const
50 {
51   return "This work was partially funded by NIH grant NXNNXXNNNNNN-NNXN";
52 }
53 //-----------------------------------------------------------------------------
54 QStringList qSlicerIGSReaderModule::contributors() const
55 {
56   QStringList moduleContributors;
57   moduleContributors << QString("John Doe (AnyWare Corp.)");
58   return moduleContributors;
59 }
60 //-----------------------------------------------------------------------------
61 QIcon qSlicerIGSReaderModule::icon() const
62 {
63   return QIcon(":/Icons/IGSReader.png");
64 }
65 //-----------------------------------------------------------------------------
66 QStringList qSlicerIGSReaderModule::categories() const
67 {
68   return QStringList() << "Examples";
69 }
70 //-----------------------------------------------------------------------------
71 QStringList qSlicerIGSReaderModule::dependencies() const
72 {
73   return QStringList();
74 }
75 //-----------------------------------------------------------------------------
76 void qSlicerIGSReaderModule::setup()
77 {
78   this->Superclass::setup();
79 }
80 //-----------------------------------------------------------------------------
81 qSlicerAbstractModuleRepresentation* qSlicerIGSReaderModule
82 ::createWidgetRepresentation() //创建窗体
83 {
84   return new qSlicerIGSReaderModuleWidget;
85 }
86  
87 //-----------------------------------------------------------------------------
88 vtkMRMLAbstractLogic* qSlicerIGSReaderModule::createLogic() //创建并调用逻辑结构
89 {
90   return vtkSlicerIGSReaderLogic::New(); //域名解析,类域为vtkSlicerIGSReaderLogic
Notice:成员函数被const修饰
如果一个成员函数不会修改数据成员,那么最好将其声明为const,因为const成员函数中不允许对数据成员进行修改,如果修改,编译器将报错,这大 大提高了程序的健壮性。 
http://blog.csdn.net/shenziheng1/article/details/78028327

3.主框架 qSlicerIGSReaderModuleWidget.h  qSlicerIGSReaderModuleWidget.cpp

 1 #ifndef __qSlicerIGSReaderModuleWidget_h
 2 #define __qSlicerIGSReaderModuleWidget_h
 3 // SlicerQt includes:基类
 4 #include "qSlicerAbstractModuleWidget.h"
 5 #include "qSlicerIGSReaderModuleExport.h"
 6 //类声明
 7 class qSlicerIGSReaderModuleWidgetPrivate;
 8 class vtkMRMLNode;
 9  
10 /// ingroup Slicer_QtModules_ExtensionTemplate
11 class Q_SLICER_QTMODULES_IGSREADER_EXPORT qSlicerIGSReaderModuleWidget :
12   public qSlicerAbstractModuleWidget
13 {
14   Q_OBJECT
15  
16 public:
17  
18   typedef qSlicerAbstractModuleWidget Superclass;
19   qSlicerIGSReaderModuleWidget(QWidget *parent=0);
20   virtual ~qSlicerIGSReaderModuleWidget();
21  
22 public slots://槽函数
23 protected:
24   QScopedPointer<qSlicerIGSReaderModuleWidgetPrivate> d_ptr;
25   virtual void setup();
26 private:
27   Q_DECLARE_PRIVATE(qSlicerIGSReaderModuleWidget);
28   Q_DISABLE_COPY(qSlicerIGSReaderModuleWidget);
29 };
30 #endif
 1 // Qt includes
 2 #include <QDebug>
 3  
 4 // SlicerQt includes
 5 #include "qSlicerIGSReaderModuleWidget.h"
 6 #include "ui_qSlicerIGSReaderModuleWidget.h"//加载主控面板
 7 //-----------------------------------------------------------------------------
 8 /// ingroup Slicer_QtModules_ExtensionTemplate :类定义
 9 class qSlicerIGSReaderModuleWidgetPrivate: public Ui_qSlicerIGSReaderModuleWidget //继承自主控面板
10 {
11 public:
12   qSlicerIGSReaderModuleWidgetPrivate();
13 };
14 //-----------------------------------------------------------------------------
15 // qSlicerIGSReaderModuleWidgetPrivate methods:类方法
16  
17 //-----------------------------------------------------------------------------
18 qSlicerIGSReaderModuleWidgetPrivate::qSlicerIGSReaderModuleWidgetPrivate()
19 {
20 }
21 //-----------------------------------------------------------------------------
22 // qSlicerIGSReaderModuleWidget methods:主类的方法
23 //-----------------------------------------------------------------------------
24 qSlicerIGSReaderModuleWidget::qSlicerIGSReaderModuleWidget(QWidget* _parent)
25   : Superclass( _parent )
26   , d_ptr( new qSlicerIGSReaderModuleWidgetPrivate ) //子类进行动态初始化
27 {
28 }
29 //-----------------------------------------------------------------------------
30 qSlicerIGSReaderModuleWidget::~qSlicerIGSReaderModuleWidget()
31 {
32 }
33 //-----------------------------------------------------------------------------
34 void qSlicerIGSReaderModuleWidget::setup()
35 {
36   Q_D(qSlicerIGSReaderModuleWidget);
37   d->setupUi(this);
38   this->Superclass::setup();
39 }

Help & Ackowledgement利用Module主体进行设计;Display等窗体我们可以利用Qt自行设计。
Notice:
这里有一个问题啊???class vtkMRMLnode应该是一个相当主要的类了,但这个类是怎么定义以及使用的呢???

4.vtkSlicerIGSReaderModuleLogic

该项目与qSlicerIGSReaderModule项目(负责总控及主面板)、qSlicerIGSReaderModuleWidgets项目(负责其他独立的面板)一同构成了Module开发的主要项目集。其中,vtkSlicerIGSReaderModuleLogic负责3D操作的Slicer逻辑类管理,更具体的就是,该类管理3D视场中数据的读取、属性更改、保存等。
vtkSlicerIGSReaderLogic.h:
 1 // .NAME vtkSlicerIGSReaderLogic - slicer logic class for volumes manipulation
 2 // .SECTION Description
 3 // This class manages the logic associated with reading, saving,
 4 // and changing propertied of the volumes
 5 #ifndef __vtkSlicerIGSReaderLogic_h
 6 #define __vtkSlicerIGSReaderLogic_h
 7 // Slicer includes
 8 #include "vtkSlicerModuleLogic.h"
 9 // MRML includes ????
10 // STD includes
11 #include <cstdlib>
12 #include "vtkSlicerIGSReaderModuleLogicExport.h"
13  
14 /// ingroup Slicer_QtModules_ExtensionTemplate
15 class VTK_SLICER_IGSREADER_MODULE_LOGIC_EXPORT vtkSlicerIGSReaderLogic :
16   public vtkSlicerModuleLogic
17 {
18 public:
19   static vtkSlicerIGSReaderLogic *New();
20   vtkTypeMacro(vtkSlicerIGSReaderLogic, vtkSlicerModuleLogic);
21   void PrintSelf(ostream& os, vtkIndent indent);
22  
23 protected:
24   vtkSlicerIGSReaderLogic();
25   virtual ~vtkSlicerIGSReaderLogic();
26  
27   virtual void SetMRMLSceneInternal(vtkMRMLScene* newScene);
28   ///场景中注册MRML节点类. 当MRMLScene连接到这个逻辑类的时候,会自动被调用
29   virtual void RegisterNodes();
30   virtual void UpdateFromMRMLScene();
31   virtual void OnMRMLSceneNodeAdded(vtkMRMLNode* node);
32   virtual void OnMRMLSceneNodeRemoved(vtkMRMLNode* node);
33 private:
34   vtkSlicerIGSReaderLogic(const vtkSlicerIGSReaderLogic&); // Not implemented
35   void operator=(const vtkSlicerIGSReaderLogic&); // Not implemented
36 };
37 #endif

vtkSlicerIGSReaderLogic:

 1 // IGSReader Logic includes
 2 #include "vtkSlicerIGSReaderLogic.h"
 3  
 4 // MRML includes
 5 #include <vtkMRMLScene.h>
 6  
 7 // VTK includes
 8 #include <vtkIntArray.h>
 9 #include <vtkNew.h>
10 #include <vtkObjectFactory.h>
11  
12 // STD includes
13 #include <cassert>
14 //----------------------------------------------------------------------------
15 vtkStandardNewMacro(vtkSlicerIGSReaderLogic);
16 //----------------------------------------------------------------------------
17 vtkSlicerIGSReaderLogic::vtkSlicerIGSReaderLogic() //构造函数
18 {
19 }
20 //----------------------------------------------------------------------------
21 vtkSlicerIGSReaderLogic::~vtkSlicerIGSReaderLogic() //析构函数
22 {
23 }
24 //----------------------------------------------------------------------------
25 void vtkSlicerIGSReaderLogic::PrintSelf(ostream& os, vtkIndent indent)
26 {
27   this->Superclass::PrintSelf(os, indent);
28 }
29  
30 //---------------------------------------------------------------------------
31 void vtkSlicerIGSReaderLogic::SetMRMLSceneInternal(vtkMRMLScene * newScene) //场景设置
32 {
33   vtkNew<vtkIntArray> events;
34   events->InsertNextValue(vtkMRMLScene::NodeAddedEvent);
35   events->InsertNextValue(vtkMRMLScene::NodeRemovedEvent);
36   events->InsertNextValue(vtkMRMLScene::EndBatchProcessEvent);
37   this->SetAndObserveMRMLSceneEventsInternal(newScene, events.GetPointer());
38 }
39  
40 //-----------------------------------------------------------------------------
41 void vtkSlicerIGSReaderLogic::RegisterNodes()
42 {
43   assert(this->GetMRMLScene() != 0);
44 }
45 //---------------------------------------------------------------------------
46 void vtkSlicerIGSReaderLogic::UpdateFromMRMLScene()
47 {
48   assert(this->GetMRMLScene() != 0);
49 }
50 //---------------------------------------------------------------------------
51 void vtkSlicerIGSReaderLogic::OnMRMLSceneNodeAdded(vtkMRMLNode* vtkNotUsed(node))
52 {
53 }
54 //---------------------------------------------------------------------------
55 void vtkSlicerIGSReaderLogic::OnMRMLSceneNodeRemoved(vtkMRMLNode* vtkNotUsed(node))
56 {
57 }

5.参考资料

《Slicer源码》
原文地址:https://www.cnblogs.com/ybqjymy/p/14235663.html