怎样在3Dslicer中创建LoadableModule

一、初始化

    1.创建LoadableModule的文件目录

利用slicer中的 extension wizard模块来产生基于模板的文件和目录。

    2.编译创建(build)

 

    3.装载(install)

 

    4.检查模块情况(check)

 

    5.用启动器打开QtDesigner

 

    6.在QtDesigner中修改界面文件.ui

 

    7.根据应用需要编辑相应的文件.cpp/.h

 

二、在QtDesigner中设置widget的图标

    1.Qt中的资源管理系统

在Qt工程的工程文件中可以包含Qt资源管理文件.qrc 。例如在Qt的界面中可能会用到的图片,其调用方式就有两种,一是放在可执行程序外部,采用绝对或相对路径的方式调用,这种方式当图片位置发生变化,那么程序将无法正常显示图片;另外一种就是使用Qt的资源系统来存储图片,这样他们就可以嵌入到可执行程序中去了。最好(图像资源等资源文件都包含在一个文件夹中,如./Icons)。相应的在在工程文件*.pro中须添加行:

RESOURCES +=\myImage.qrc

对于Qt资源管理文件.qrc,在工程的目录下须建立一个资源管理文件夹如./Icons,在该文件夹中放入资源文件如image.png等(Qt的资源系统要求资源文件必须放在qrc文件的同级或子级目录下)。其实资源可以是任意类型的,不只是图片文件,不过资源只能是只读的,不能对其进行更改。编译时会对加入的资源自动压缩。

.qrc文件实际上是一个XML格式的文件,在其中须添加如下内容(典型的*.qrc文件):

<!DOCTYPE RCC><RCC version="1.0">
<qresource>
    <file>Icons/image.png</file>
</qresource>
</RCC>

在项目的cpp文件中引用资源时:

QIcon(":/Icons/image.png") //调用Icons文件夹中的image.png。

    2.怎样为Qt部件添加图标

需要在部件的图标属性入口处(部件的属性管理器)选择资源文件:

 

  • Slicer4/Modules/Loadable/MY_MODULE_NAME/Resources/qSlicerMY_MODULE_NAMEModule.qrc
  • Slicer4/Libs/MRML/Widgets/Resources/qMRMLWidget.qrc
  • Slicer4/Base/QTGUI/Resources/qSlicerBaseQTGUI.qrc

    3.为资源系统添加资源文件

首先在/Icons目录下(Slicer4/Modules/Loadable/MY_MODULE_NAME/Resources/Icon)加入资源文件如pic.png。然后需要在

资源管理文件.qrc中加入如下代码:

<file>Icons/MyIcon.png</file>

三、3Dslicer中模块之间的相互依存关系

在有些情况下你自己开发的loadablemodule需要用到其他模块的信息,如一个模块的logic或者是一些定制的MRML类,这种情况下不需要重复编写模块功能,可采用如下方式,下面的代码给出要设计一个模块依存于Volume模块的logic应该怎样做:

1.修改CMakeLists.txt

set(MODULE_INCLUDE_DIRECTORIES
   ${CMAKE_CURRENT_SOURCE_DIR}/Widgets
   ${CMAKE_CURRENT_BINARY_DIR}/Widgets
   ${vtkSlicerVolumesModuleLogic_SOURCE_DIR}       #添加
   ${vtkSlicerVolumesModuleLogic_BINARY_DIR}       #添加
   )
  ... 
 set(MODULE_TARGET_LIBRARIES
   ...
   vtkSlicerVolumesModuleLogic                     #添加
   )

2.在qSlicerMY_MODULE_NAMEModule.cxx中修改

 //-----------------------------------------------------------------------------
 QStringList qSlicerMY_MODULE_NAMEModule::dependencies()const
 {
   return QStringList() << "Volumes";
 }
 
 //-----------------------------------------------------------------------------
 void qSlicerMY_MODULE_NAMEModule::setup()
 {
   this->Superclass::setup();

   vtkSlicerMY_MODULE_NAMELogic* moduleLogic =
     vtkSlicerMY_MODULE_NAMELogic::SafeDownCast(this->logic());

   qSlicerAbstractCoreModule* volumesModule =
     qSlicerCoreApplication::application()->moduleManager()->module("Volumes");
   if (volumesModule)
     {
     vtkSlicerVolumesLogic* volumesLogic = 
       vtkSlicerVolumesLogic::SafeDownCast(volumesModule->logic());
     moduleLogic->SetVolumesLogic(volumesLogic);
     }

在指定了模块的依存关系后,确保了被依存模块会在该模块之前进行setup()。

在CMakeLists.txt中采用类似的操作添加对一个模块部件(widget)的依存:

set(MODULE_INCLUDE_DIRECTORIES
  ... 
  ${qSlicerVolumesModuleWidgets_SOURCE_DIR}
  ${qSlicerVolumesModuleWidgets_BINARY_DIR}
  ...
  )
 ...
 set(MODULE_TARGET_LIBRARIES
   ...
   qSlicerVolumesModuleWidgets
   )

如果想要获取一个custom MRML或者displayable manager 类,采用相同的工作模式:

  • custom MRML (vtkSlicerDEPENDENT_MODULEModuleMRML_SOURCE_DIR)
  • displayable manager (vtkSlicerDEPENDENT_MODULEModuleDisplayableManager_SOURCE_DIR)

四、典型应用

Crop Volume module  依存于  Volumes module

posted @ 2018-05-10 12:45  DH_HUSTer  阅读(30)  评论(0编辑  收藏  举报